예제 #1
0
        static int Main(string[] args)
        {
            bool hasError        = false;
            var  testProjectPath = args.Length > 0 ? args[0] : null;

            Console.WriteLine($"CMake Bin: {CMakeEnv.DefaultInstance.CMakeBin}");
            List <CMakeKitInfo> kitInfos = new List <CMakeKitInfo>();

            foreach (var kitInfo in CMakeKitsScanner.ScanAllKits())
            {
                kitInfos.Add(kitInfo);
                Console.WriteLine($"Found Kit: {kitInfo.Name}");
            }
            kitInfos.Add(CMakeKitsScanner.ScanAllKits().First());
            if (!string.IsNullOrEmpty(testProjectPath))
            {
                foreach (var kitInfo in kitInfos)
                {
                    var kit = new CMakeKit(kitInfo);
                    if (kit.Name.IndexOf("arm") != -1 || kit.Name.IndexOf("Visual Studio 2015") != -1)
                    {
                        continue;
                    }
                    Console.WriteLine($"Test Kit: {kitInfo.Name}");
                    var sourcePath = testProjectPath;
                    var buildPath  = Path.Combine(testProjectPath, "bin", kitInfo.Name);
                    if (Directory.Exists(buildPath))
                    {
                        Directory.Delete(buildPath, true);
                    }
                    using (var process = kit.StartConfigure(CMakeEnv.DefaultInstance, sourcePath, buildPath, default(CMakeConfigureConfig), ModifyStartInfo))
                    {
                        process.WaitForExit();
                        if (process.ExitCode != 0)
                        {
                            Console.WriteLine($"    *Failed to configure the project");
                            hasError = true;
                            continue;
                        }
                    }
                    using (var process = kit.StartBuild(CMakeEnv.DefaultInstance, buildPath, null, ModifyStartInfo))
                    {
                        process.WaitForExit();
                        if (process.ExitCode != 0)
                        {
                            Console.WriteLine($"    *Failed to build the project");
                            hasError = true;
                            continue;
                        }
                    }
                    Console.WriteLine($"    Done");
                }
            }
            return(hasError ? 1 : 0);
        }
예제 #2
0
 private async Task<bool> ExecuteJob(StepwiseLog log)
 {
     var eocLogWriter = new StringWriter();
     var eocLogger = new StreamLoggerWithContext(eocLogWriter, eocLogWriter, false);
     var step = new SpecificStepLog()
     {
         Description = "转换为C++/CMake工程",
     };
     log.Steps.Add(step);
     try
     {
         if (!EocEnv.IsValid)
         {
             eocLogger.Error("环境变量EOC_HOME未正确配置");
             step.State = StepState.Failed;
         }
         var source = new EProjectFile.EProjectFile();
         source.Load(File.OpenRead(ViewModel.SourcePath));
         if (source.ESystemInfo.FileType != 3 && !ViewModel.Force)
         {
             eocLogger.Error("源文件应为ECom(*.ec)文件");
             step.State = StepState.Failed;
         }
         else
         {
             await Task.Run(() =>
             {
                 new ProjectConverter(source, ViewModel.ProjectType, null, eocLogger).Generate(ViewModel.OutputPath);
                 eocLogger.Info("完成");
             });
         }
     }
     catch (Exception exception)
     {
         eocLogger.Error("处理程序不正常退出,异常信息:{0}", exception);
         step.State = StepState.Failed;
     }
     step.Content = new TextBlock()
     {
         TextWrapping = TextWrapping.Wrap,
         Text = eocLogWriter.ToString()
     };
     if (step.State == StepState.Failed)
     {
         return false;
     }
     step.State = StepState.Success;
     if (!ViewModel.Build)
     {
         return false;
     }
     step = new SpecificStepLog()
     {
         Description = "初始化CMake环境",
     };
     log.Steps.Add(step);
     if (CMakeEnv.DefaultInstance == null)
     {
         step.State = StepState.Failed;
         step.Content = new TextBlock()
         {
             TextWrapping = TextWrapping.Wrap,
             Text = "Error: 未找到CMake编译环境"
         };
         return false;
     }
     if (ViewModel.CMakeKit == null || ViewModel.ProjectConfig == null)
     {
         step.State = StepState.Failed;
         step.Content = new TextBlock()
         {
             TextWrapping = TextWrapping.Wrap,
             Text = "Error: 工具链参数不完整"
         };
         return false;
     }
     step.Content = new TextBlock()
     {
         TextWrapping = TextWrapping.Wrap,
         Text = $"CMake Detected: {CMakeEnv.DefaultInstance.CMakeBin}"
     };
     CMakeKit cmakeKit;
     try
     {
         cmakeKit = new CMakeKit(ViewModel.CMakeKit);
     }
     catch (Exception)
     {
         step.State = StepState.Failed;
         step.Content = new TextBlock()
         {
             TextWrapping = TextWrapping.Wrap,
             Text = $"Error: 初始化工具链 (${ViewModel.CMakeKit?.Name}) 失败"
         };
         return false;
     }
     step.State = StepState.Success;
     var success = await RunProcessAsync(log, "配置CMake工程", startInfoHelper => cmakeKit.StartConfigure(
         CMakeEnv.DefaultInstance,
         ViewModel.OutputPath,
         ViewModel.BuildPath,
         new Dictionary<string, CMakeSetting>() {
             {"CMAKE_BUILD_TYPE", new CMakeSetting(ViewModel.ProjectConfig, "STRING") }
         },
         startInfoHelper));
     if (!success)
     {
         return false;
     }
     success = await RunProcessAsync(log, "编译CMake工程", startInfoHelper => cmakeKit.StartBuild(
         CMakeEnv.DefaultInstance,
         ViewModel.BuildPath,
         new CMakeBuildConfig()
         {
             Config = ViewModel.ProjectConfig
         },
         startInfoHelper));
     if (!success)
     {
         return false;
     }
     return true;
 }