diff --git a/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs b/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs index 225e46ba7..23d2be157 100644 --- a/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs +++ b/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs @@ -628,7 +628,10 @@ namespace Flax.Build } } if (failed) + { + Globals.BuildErrors = true; throw new Exception($"Failed to build target {target.Name}. See log."); + } } else { @@ -689,7 +692,10 @@ namespace Flax.Build } } if (failed) + { + Globals.BuildErrors = true; throw new Exception($"Failed to build target {target.Name}. See log."); + } } else { diff --git a/Source/Tools/Flax.Build/Globals.cs b/Source/Tools/Flax.Build/Globals.cs index b5f3088d6..994094124 100644 --- a/Source/Tools/Flax.Build/Globals.cs +++ b/Source/Tools/Flax.Build/Globals.cs @@ -22,6 +22,11 @@ namespace Flax.Build /// public static ProjectInfo Project; + /// + /// Set when any build related errors were raised. + /// + public static bool BuildErrors = false; + /// /// All platforms array. /// diff --git a/Source/Tools/Flax.Build/Program.cs b/Source/Tools/Flax.Build/Program.cs index 5e7cf926c..bac1caaa8 100644 --- a/Source/Tools/Flax.Build/Program.cs +++ b/Source/Tools/Flax.Build/Program.cs @@ -171,7 +171,9 @@ namespace Flax.Build } catch (Exception ex) { - Log.Exception(ex); + // Ignore exception logging for build errors + if (!Globals.BuildErrors) + Log.Exception(ex); failed = true; } finally diff --git a/Source/Tools/Flax.Build/Projects/VisualStudio/CSSDKProjectGenerator.cs b/Source/Tools/Flax.Build/Projects/VisualStudio/CSSDKProjectGenerator.cs index 387a0dcff..77b7abf46 100644 --- a/Source/Tools/Flax.Build/Projects/VisualStudio/CSSDKProjectGenerator.cs +++ b/Source/Tools/Flax.Build/Projects/VisualStudio/CSSDKProjectGenerator.cs @@ -90,6 +90,11 @@ namespace Flax.Build.Projects.VisualStudio var baseConfiguration = project.Configurations.First(); var baseOutputDir = Utilities.MakePathRelativeTo(project.CSharp.OutputPath ?? baseConfiguration.TargetBuildOptions.OutputFolder, projectDirectory); var baseIntermediateOutputPath = Utilities.MakePathRelativeTo(project.CSharp.IntermediateOutputPath ?? Path.Combine(baseConfiguration.TargetBuildOptions.IntermediateFolder, "CSharp"), projectDirectory); + + bool isMainProject = Globals.Project.ProjectFolderPath == project.WorkspaceRootPath && project.Name != "BuildScripts" && (Globals.Project.Name != "Flax" || project.Name != "FlaxEngine"); + var flaxBuildTargetsFilename = isMainProject ? "Flax.Build.CSharp.targets" : "Flax.Build.CSharp.SkipBuild.targets"; + var cacheProjectsPath = Utilities.MakePathRelativeTo(Path.Combine(Globals.Root, "Cache", "Projects"), projectDirectory); + var flaxBuildTargetsPath = !string.IsNullOrEmpty(cacheProjectsPath) ? Path.Combine(cacheProjectsPath, flaxBuildTargetsFilename) : flaxBuildTargetsFilename; csProjectFileContent.AppendLine(" net7.0"); csProjectFileContent.AppendLine(" disable"); @@ -106,14 +111,14 @@ namespace Flax.Build.Projects.VisualStudio csProjectFileContent.AppendLine(" 11.0"); csProjectFileContent.AppendLine(" 512"); - // Needed for Hostfxr - csProjectFileContent.AppendLine(" true"); - csProjectFileContent.AppendLine(" true"); //csProjectFileContent.AppendLine(" false"); // TODO: use it to reduce burden of framework libs - // This needs to be set here to fix errors in VS - csProjectFileContent.AppendLine(string.Format(" {0}", baseOutputDir)); - csProjectFileContent.AppendLine(string.Format(" {0}", baseIntermediateOutputPath)); + // Custom .targets file for overriding MSBuild build tasks + csProjectFileContent.AppendLine(string.Format(" $(MSBuildThisFileDirectory){0}", flaxBuildTargetsPath)); + + // Hide annoying warnings during build + csProjectFileContent.AppendLine(" false"); + csProjectFileContent.AppendLine(" True"); csProjectFileContent.AppendLine(" "); csProjectFileContent.AppendLine(""); diff --git a/Source/Tools/Flax.Build/Projects/VisualStudio/VisualStudioProjectGenerator.cs b/Source/Tools/Flax.Build/Projects/VisualStudio/VisualStudioProjectGenerator.cs index 1ba8e6709..48ecb6425 100644 --- a/Source/Tools/Flax.Build/Projects/VisualStudio/VisualStudioProjectGenerator.cs +++ b/Source/Tools/Flax.Build/Projects/VisualStudio/VisualStudioProjectGenerator.cs @@ -518,7 +518,15 @@ namespace Flax.Build.Projects.VisualStudio else if (firstFullMatch != -1) { projectConfiguration = configuration; - build = solution.MainProject == project || (solution.MainProject == null && project.Name == solution.Name); + + // Always build the main project + build = solution.MainProject == project; + + // Build C# projects (needed for Rider solution wide analysis) + build |= project.Type == TargetType.DotNetCore; + + // + build |= solution.MainProject == null && project.Name == solution.Name; } else if (firstPlatformMatch != -1 && !configuration.Name.StartsWith("Editor.")) { @@ -679,6 +687,57 @@ namespace Flax.Build.Projects.VisualStudio Utilities.WriteFileIfChanged(dotSettingsUserFilePath, dotSettingsFileContent.ToString()); } + + // Custom MSBuild .targets file to prevent building Flax C#-projects directly with MSBuild + { + var targetsFileContent = new StringBuilder(); + targetsFileContent.AppendLine(""); + targetsFileContent.AppendLine(" "); + targetsFileContent.AppendLine(" "); + targetsFileContent.AppendLine(""); + + Utilities.WriteFileIfChanged(Path.Combine(Globals.Root, "Cache", "Projects", "Flax.Build.CSharp.SkipBuild.targets"), targetsFileContent.ToString()); + } + + // Override MSBuild build tasks to run Flax.Build in C#-only projects + { + // Build command for the build tool + var buildToolPath = Path.ChangeExtension(Utilities.MakePathRelativeTo(typeof(Builder).Assembly.Location, Path.GetDirectoryName(solution.MainProject.Path)), null); + + var targetsFileContent = new StringBuilder(); + targetsFileContent.AppendLine(""); + targetsFileContent.AppendLine(" "); + targetsFileContent.AppendLine(" "); + AppendBuildToolCommands(targetsFileContent, "-build"); + targetsFileContent.AppendLine(" "); + targetsFileContent.AppendLine(" "); + AppendBuildToolCommands(targetsFileContent, "-rebuild"); + targetsFileContent.AppendLine(" "); + targetsFileContent.AppendLine(" "); + AppendBuildToolCommands(targetsFileContent, "-clean"); + targetsFileContent.AppendLine(" "); + targetsFileContent.AppendLine(""); + + Utilities.WriteFileIfChanged(Path.Combine(Globals.Root, "Cache", "Projects", "Flax.Build.CSharp.targets"), targetsFileContent.ToString()); + + void AppendBuildToolCommands(StringBuilder str, string extraArgs) + { + foreach (var configuration in solution.MainProject.Configurations) + { + var cmdLine = string.Format("{0} -log -mutex -workspace={1} -arch={2} -configuration={3} -platform={4} -buildTargets={5}", + FixPath(buildToolPath), + FixPath(solution.MainProject.WorkspaceRootPath), + configuration.Architecture, + configuration.Configuration, + configuration.Platform, + configuration.Target); + if (!string.IsNullOrEmpty(Configuration.Compiler)) + cmdLine += " -compiler=" + Configuration.Compiler; + + str.AppendLine(string.Format(" ", cmdLine, extraArgs, configuration.Name)); + } + } + } } /// @@ -716,5 +775,14 @@ namespace Flax.Build.Projects.VisualStudio projects.Add(project); } } + + private static string FixPath(string path) + { + if (path.Contains(' ')) + { + path = "\"" + path + "\""; + } + return path; + } } }