コード例 #1
0
ファイル: ProjectInfo.cs プロジェクト: yf885188/FlaxEngine
        private bool IsTargetCSharpOnly(string name)
        {
            var rules  = Builder.GenerateRulesAssembly();
            var target = rules.GetTarget(name);

            return(target == null || target.Modules.TrueForAll(x => !rules.GetModule(x).BuildNativeCode));
        }
コード例 #2
0
        private void BuildMainExecutable(TaskGraph graph, BuildOptions buildOptions)
        {
            if (IsPreBuilt)
            {
                return;
            }
            var outputPath      = Path.Combine(buildOptions.OutputFolder, buildOptions.Platform.GetLinkOutputFileName(OutputName, LinkerOutput.Executable));
            var exeBuildOptions = Builder.GetBuildOptions(this, buildOptions.Platform, buildOptions.Toolchain, buildOptions.Architecture, buildOptions.Configuration, buildOptions.WorkingDirectory);

            exeBuildOptions.LinkEnv.Output = LinkerOutput.Executable;
            var rules     = Builder.GenerateRulesAssembly();
            var buildData = new Builder.BuildData
            {
                Rules         = rules,
                Target        = this,
                Graph         = graph,
                TargetOptions = exeBuildOptions,
                Platform      = buildOptions.Platform,
                Toolchain     = buildOptions.Toolchain,
                Architecture  = buildOptions.Architecture,
                Configuration = buildOptions.Configuration,
            };

            // Build Main module
            var mainModule           = rules.GetModule("Main");
            var mainModuleOutputPath = Path.Combine(exeBuildOptions.IntermediateFolder, mainModule.Name);

            if (!Directory.Exists(mainModuleOutputPath))
            {
                Directory.CreateDirectory(mainModuleOutputPath);
            }
            var mainModuleOptions = new BuildOptions
            {
                Target             = this,
                Platform           = buildOptions.Platform,
                Toolchain          = buildOptions.Toolchain,
                Architecture       = buildOptions.Architecture,
                Configuration      = buildOptions.Configuration,
                CompileEnv         = (CompileEnvironment)exeBuildOptions.CompileEnv.Clone(),
                LinkEnv            = (LinkEnvironment)exeBuildOptions.LinkEnv.Clone(),
                IntermediateFolder = mainModuleOutputPath,
                OutputFolder       = mainModuleOutputPath,
                WorkingDirectory   = exeBuildOptions.WorkingDirectory,
                HotReloadPostfix   = exeBuildOptions.HotReloadPostfix,
            };

            mainModuleOptions.SourcePaths.Add(mainModule.FolderPath);
            mainModule.Setup(mainModuleOptions);
            mainModuleOptions.MergeSourcePathsIntoSourceFiles();
            mainModuleOptions.CompileEnv.PreprocessorDefinitions.Add("FLAXENGINE_API=" + buildOptions.Toolchain.DllImport);
            Builder.BuildModuleInner(buildData, mainModule, mainModuleOptions, false);

            // Link executable
            exeBuildOptions.LinkEnv.InputLibraries.Add(Path.Combine(buildOptions.OutputFolder, buildOptions.Platform.GetLinkOutputFileName(OutputName, LinkerOutput.SharedLibrary)));
            foreach (var e in mainModuleOptions.OutputFiles)
            {
                exeBuildOptions.LinkEnv.InputFiles.Add(e);
            }
            foreach (var e in mainModuleOptions.DependencyFiles)
            {
                exeBuildOptions.DependencyFiles.Add(e);
            }
            foreach (var e in mainModuleOptions.OptionalDependencyFiles)
            {
                exeBuildOptions.OptionalDependencyFiles.Add(e);
            }
            exeBuildOptions.Libraries.AddRange(mainModuleOptions.Libraries);
            exeBuildOptions.DelayLoadLibraries.AddRange(mainModuleOptions.DelayLoadLibraries);
            exeBuildOptions.ScriptingAPI.Add(mainModuleOptions.ScriptingAPI);
            buildOptions.Toolchain.LinkFiles(graph, exeBuildOptions, outputPath);
        }
コード例 #3
0
        static int Main()
        {
            // Setup
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol  = SecurityProtocolType.Tls12;

            // Show help option
            if (CommandLine.HasOption("help"))
            {
                Console.WriteLine(CommandLine.GetHelp(typeof(Configuration)));
                return(0);
            }

            Mutex singleInstanceMutex = null;
            var   startTime           = DateTime.Now;
            bool  failed = false;

            try
            {
                // Setup
                CommandLine.Configure(typeof(Configuration));
                if (Configuration.CurrentDirectory != null)
                {
                    Environment.CurrentDirectory = Configuration.CurrentDirectory;
                }
                Globals.Root = Directory.GetCurrentDirectory();
                var executingAssembly = System.Reflection.Assembly.GetExecutingAssembly();
                Globals.EngineRoot = Utilities.RemovePathRelativeParts(Path.Combine(Path.GetDirectoryName(executingAssembly.Location), "..", ".."));
                Log.Init();

                // Log basic info
                Version version       = executingAssembly.GetName().Version;
                string  versionString = string.Join(".", version.Major, version.Minor, version.Build);
                Log.Info(string.Format("Flax.Build {0}", versionString));
                using (new LogIndentScope())
                {
                    Log.Verbose("Arguments: " + CommandLine.Get());
                    Log.Verbose("Workspace: " + Globals.Root);
                    Log.Verbose("Engine: " + Globals.EngineRoot);
                }

                // Load project
                {
                    var projectFiles = Directory.GetFiles(Globals.Root, "*.flaxproj", SearchOption.TopDirectoryOnly);
                    if (projectFiles.Length == 1)
                    {
                        Globals.Project = ProjectInfo.Load(projectFiles[0]);
                    }
                    else if (projectFiles.Length > 1)
                    {
                        throw new Exception("Too many project files. Don't know which to pick.");
                    }
                    else
                    {
                        Log.Warning("Missing project file.");
                    }
                }

                // Use mutex if required
                if (Configuration.Mutex)
                {
                    singleInstanceMutex = new Mutex(true, "Flax.Build", out var oneInstanceMutexCreated);

                    if (!oneInstanceMutexCreated)
                    {
                        try
                        {
                            if (!singleInstanceMutex.WaitOne(0))
                            {
                                Log.Warning("Wait for another instance(s) of Flax.Build to end...");
                                singleInstanceMutex.WaitOne();
                            }
                        }
                        catch (AbandonedMutexException)
                        {
                            // Can occur if another Flax.Build is killed in the debugger
                        }
                        finally
                        {
                            Log.Info("Waiting done.");
                        }
                    }
                }

                // Collect all targets and modules from the workspace
                Builder.GenerateRulesAssembly();

                // Print SDKs
                if (Configuration.PrintSDKs)
                {
                    Log.Info("Printing SDKs...");
                    Sdk.Print();
                }

                // Deps tool
                if (Configuration.BuildDeps || Configuration.ReBuildDeps)
                {
                    Log.Info("Building dependencies...");
                    failed |= DepsBuilder.Run();
                }

                // Clean
                if (Configuration.Clean || Configuration.Rebuild)
                {
                    Log.Info("Cleaning build workspace...");
                    Builder.Clean();
                }

                // Generate projects for the targets and solution for the workspace
                if (Configuration.GenerateProject)
                {
                    Log.Info("Generating project files...");
                    Builder.GenerateProjects();
                }

                // Build targets
                if (Configuration.Build || Configuration.Rebuild)
                {
                    Log.Info("Building targets...");
                    failed |= Builder.BuildTargets();
                }

                // Deploy tool
                if (Configuration.Deploy)
                {
                    Log.Info("Running deployment...");
                    failed |= Deployer.Run();
                }

                // Performance logging
                if (Configuration.PerformanceInfo)
                {
                    Log.Info(string.Empty);
                    Log.Info("Performance Summary");
                    Profiling.LogStats();
                }
                if (Configuration.TraceEventFile != null)
                {
                    Profiling.GenerateTraceEventFile();
                }
            }
            catch (Exception ex)
            {
                Log.Exception(ex);
                return(1);
            }
            finally
            {
                if (singleInstanceMutex != null)
                {
                    singleInstanceMutex.Dispose();
                    singleInstanceMutex = null;
                }

                var endTime = DateTime.Now;
                Log.Info(string.Format("Total time: {0}", endTime - startTime));
                Log.Verbose("End.");
                Log.Dispose();
            }

            return(failed ? 1 : 0);
        }