Merge remote-tracking branch 'origin/master' into sdl_platform

This commit is contained in:
2025-10-12 11:18:28 +03:00
175 changed files with 2079 additions and 939 deletions

View File

@@ -192,6 +192,8 @@ namespace Flax.Build
{
// Pick the project format
var projectFormats = new HashSet<ProjectFormat>();
if (Configuration.ProjectFormatVS2026)
projectFormats.Add(ProjectFormat.VisualStudio2026);
if (Configuration.ProjectFormatVS2022)
projectFormats.Add(ProjectFormat.VisualStudio2022);
if (Configuration.ProjectFormatVS2019)
@@ -209,8 +211,13 @@ namespace Flax.Build
if (projectFormats.Count == 0)
projectFormats.Add(Platform.BuildPlatform.DefaultProjectFormat);
// Always generate VS solution files for project (needed for C# Intellisense support)
projectFormats.Add(ProjectFormat.VisualStudio2022);
// Always generate VS solution files for project (needed for C# Intellisense support in other IDEs)
if (!projectFormats.Contains(ProjectFormat.VisualStudio2026) &&
!projectFormats.Contains(ProjectFormat.VisualStudio2022) &&
!projectFormats.Contains(ProjectFormat.VisualStudio))
{
projectFormats.Add(ProjectFormat.VisualStudio2022);
}
foreach (ProjectFormat projectFormat in projectFormats)
GenerateProject(projectFormat);

View File

@@ -192,11 +192,18 @@ namespace Flax.Build
{
if (string.IsNullOrEmpty(path))
return string.Empty;
if (path.StartsWith(Globals.EngineRoot))
path = Utilities.NormalizePath(path);
if (IsMacroPath(path, Globals.EngineRoot))
path = "$(EnginePath)" + path.Substring(Globals.EngineRoot.Length);
else if (path.StartsWith(projectPath))
else if (IsMacroPath(path, projectPath))
path = "$(ProjectPath)" + path.Substring(projectPath.Length);
return Utilities.NormalizePath(path);
return path;
}
private static bool IsMacroPath(string path, string root)
{
root = Utilities.NormalizePath(root);
return path == root || path.StartsWith(root + '/');
}
}

View File

@@ -201,6 +201,12 @@ namespace Flax.Build
[CommandLine("vs2022", "Generates Visual Studio 2022 project format files. Valid only with -genproject option.")]
public static bool ProjectFormatVS2022 = false;
/// <summary>
/// Generates Visual Studio 2026 project format files. Valid only with -genproject option.
/// </summary>
[CommandLine("vs2026", "Generates Visual Studio 2026 project format files. Valid only with -genproject option.")]
public static bool ProjectFormatVS2026 = false;
/// <summary>
/// Generates Visual Studio Code project format files. Valid only with -genproject option.
/// </summary>

View File

@@ -32,8 +32,11 @@ namespace Flax.Build.Platforms
if (!toolsets.ContainsKey(WindowsPlatformToolset.v141) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v142) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v143) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v144))
!toolsets.ContainsKey(WindowsPlatformToolset.v144) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v145))
{
_hasRequiredSDKsInstalled = false;
}
}
}
}

View File

@@ -31,7 +31,12 @@ namespace Flax.Build.Platforms
}
// Visual Studio 2017+ supported only
var visualStudio = VisualStudioInstance.GetInstances().FirstOrDefault(x => x.Version == VisualStudioVersion.VisualStudio2017 || x.Version == VisualStudioVersion.VisualStudio2019 || x.Version == VisualStudioVersion.VisualStudio2022);
var visualStudio = VisualStudioInstance.GetInstances().FirstOrDefault(x =>
x.Version == VisualStudioVersion.VisualStudio2017 ||
x.Version == VisualStudioVersion.VisualStudio2019 ||
x.Version == VisualStudioVersion.VisualStudio2022 ||
x.Version == VisualStudioVersion.VisualStudio2026
);
if (visualStudio == null)
_hasRequiredSDKsInstalled = false;
@@ -46,7 +51,8 @@ namespace Flax.Build.Platforms
if (!toolsets.ContainsKey(WindowsPlatformToolset.v141) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v142) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v143) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v144))
!toolsets.ContainsKey(WindowsPlatformToolset.v144) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v145))
{
_hasRequiredSDKsInstalled = false;
}

View File

@@ -29,7 +29,12 @@ namespace Flax.Build.Platforms
public UWPToolchain(UWPPlatform platform, TargetArchitecture architecture, WindowsPlatformToolset toolsetVer = WindowsPlatformToolset.Latest, WindowsPlatformSDK sdkVer = WindowsPlatformSDK.Latest)
: base(platform, architecture, toolsetVer, sdkVer)
{
var visualStudio = VisualStudioInstance.GetInstances().FirstOrDefault(x => x.Version == VisualStudioVersion.VisualStudio2017 || x.Version == VisualStudioVersion.VisualStudio2019 || x.Version == VisualStudioVersion.VisualStudio2022);
var visualStudio = VisualStudioInstance.GetInstances().FirstOrDefault(x =>
x.Version == VisualStudioVersion.VisualStudio2017 ||
x.Version == VisualStudioVersion.VisualStudio2019 ||
x.Version == VisualStudioVersion.VisualStudio2022 ||
x.Version == VisualStudioVersion.VisualStudio2026
);
if (visualStudio == null)
throw new Exception("Missing Visual Studio 2017 or newer. It's required to build for UWP.");
_usingDirs.Add(Path.Combine(visualStudio.Path, "VC", "vcpackages"));

View File

@@ -40,7 +40,8 @@ namespace Flax.Build.Platforms
!toolsets.ContainsKey(WindowsPlatformToolset.v141) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v142) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v143) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v144))
!toolsets.ContainsKey(WindowsPlatformToolset.v144) &&
!toolsets.ContainsKey(WindowsPlatformToolset.v145))
{
Log.Warning("Missing MSVC toolset v140 or later (VS 2015 or later C++ build tools). Cannot build for Windows platform.");
_hasRequiredSDKsInstalled = false;

View File

@@ -54,6 +54,11 @@ namespace Flax.Build.Platforms
/// Visual Studio 2022 (v17.10 and later)
/// </summary>
v144 = 144,
/// <summary>
/// Visual Studio 2026
/// </summary>
v145 = 145,
}
/// <summary>
@@ -252,6 +257,8 @@ namespace Flax.Build.Platforms
_toolsets[WindowsPlatformToolset.v143] = toolset;
else if (version.Major == 14 && version.Minor / 10 == 4)
_toolsets[WindowsPlatformToolset.v144] = toolset;
else if (version.Major == 14 && version.Minor / 10 == 5)
_toolsets[WindowsPlatformToolset.v145] = toolset;
else
Log.Warning("Found Unsupported MSVC toolset version: " + version);
}
@@ -287,11 +294,12 @@ namespace Flax.Build.Platforms
}
}
// Visual Studio 2017-2022 - multiple instances
// Visual Studio 2017 or later - multiple instances
foreach (var vs in vsInstances.Where(x =>
x.Version == VisualStudioVersion.VisualStudio2017 ||
x.Version == VisualStudioVersion.VisualStudio2019 ||
x.Version == VisualStudioVersion.VisualStudio2022
x.Version == VisualStudioVersion.VisualStudio2022 ||
x.Version == VisualStudioVersion.VisualStudio2026
))
{
FindMsvcToolsets(Path.Combine(vs.Path, "VC", "Tools", "MSVC"));
@@ -469,6 +477,7 @@ namespace Flax.Build.Platforms
case WindowsPlatformToolset.v142:
case WindowsPlatformToolset.v143:
case WindowsPlatformToolset.v144:
case WindowsPlatformToolset.v145:
{
string hostFolder = hostArchitecture == TargetArchitecture.x86 ? "HostX86" : $"Host{hostArchitecture.ToString().ToLower()}";
string nativeCompilerPath = Path.Combine(vcToolChainDir, "bin", hostFolder, architecture.ToString().ToLower(), "cl.exe");

View File

@@ -89,7 +89,11 @@ namespace Flax.Build.Platforms
// Pick the newest installed Visual Studio version if using the default toolset
if (toolsetVer == WindowsPlatformToolset.Default)
{
if (VisualStudioInstance.HasIDE(VisualStudioVersion.VisualStudio2022))
if (VisualStudioInstance.HasIDE(VisualStudioVersion.VisualStudio2026))
{
toolsetVer = WindowsPlatformToolset.v145;
}
else if (VisualStudioInstance.HasIDE(VisualStudioVersion.VisualStudio2022))
{
if (toolsets.Keys.Contains(WindowsPlatformToolset.v144))
{
@@ -206,6 +210,7 @@ namespace Flax.Build.Platforms
case WindowsPlatformToolset.v142:
case WindowsPlatformToolset.v143:
case WindowsPlatformToolset.v144:
case WindowsPlatformToolset.v145:
{
switch (Architecture)
{
@@ -392,6 +397,7 @@ namespace Flax.Build.Platforms
var vcToolChainDir = toolsets[Toolset];
switch (Toolset)
{
case WindowsPlatformToolset.v145:
case WindowsPlatformToolset.v144:
case WindowsPlatformToolset.v143:
case WindowsPlatformToolset.v142:

View File

@@ -37,6 +37,11 @@ namespace Flax.Build.Projects
/// </summary>
VisualStudio2022,
/// <summary>
/// Visual Studio 2026.
/// </summary>
VisualStudio2026,
/// <summary>
/// Visual Studio Code.
/// </summary>

View File

@@ -84,7 +84,11 @@ namespace Flax.Build.Projects
// Pick the newest installed Visual Studio version
if (format == ProjectFormat.VisualStudio)
{
if (VisualStudioInstance.HasIDE(VisualStudioVersion.VisualStudio2022))
if (VisualStudioInstance.HasIDE(VisualStudioVersion.VisualStudio2026))
{
format = ProjectFormat.VisualStudio2026;
}
else if (VisualStudioInstance.HasIDE(VisualStudioVersion.VisualStudio2022))
{
format = ProjectFormat.VisualStudio2022;
}
@@ -113,6 +117,7 @@ namespace Flax.Build.Projects
case ProjectFormat.VisualStudio2017:
case ProjectFormat.VisualStudio2019:
case ProjectFormat.VisualStudio2022:
case ProjectFormat.VisualStudio2026:
{
VisualStudioVersion vsVersion;
switch (format)
@@ -129,6 +134,9 @@ namespace Flax.Build.Projects
case ProjectFormat.VisualStudio2022:
vsVersion = VisualStudioVersion.VisualStudio2022;
break;
case ProjectFormat.VisualStudio2026:
vsVersion = VisualStudioVersion.VisualStudio2026;
break;
default: throw new ArgumentOutOfRangeException(nameof(format), format, null);
}
switch (type)

View File

@@ -50,7 +50,9 @@ namespace Flax.Build.Projects.VisualStudio
projectTypes = ProjectTypeGuids.ToOption(ProjectTypeGuids.FlaxVS) + ';' + projectTypes;
// Try to reuse the existing project guid from solution file
vsProject.ProjectGuid = GetProjectGuid(solutionPath, vsProject.Name);
vsProject.ProjectGuid = GetProjectGuid(vsProject.Path, vsProject.Name);
if (vsProject.ProjectGuid == Guid.Empty)
vsProject.ProjectGuid = GetProjectGuid(solutionPath, vsProject.Name);
if (vsProject.ProjectGuid == Guid.Empty)
vsProject.ProjectGuid = Guid.NewGuid();

View File

@@ -55,7 +55,9 @@ namespace Flax.Build.Projects.VisualStudio
}
// Try to reuse the existing project guid from solution file
vsProject.ProjectGuid = GetProjectGuid(solutionPath, vsProject.Name);
vsProject.ProjectGuid = GetProjectGuid(vsProject.Path, vsProject.Name);
if (vsProject.ProjectGuid == Guid.Empty)
vsProject.ProjectGuid = GetProjectGuid(solutionPath, vsProject.Name);
if (vsProject.ProjectGuid == Guid.Empty)
vsProject.ProjectGuid = Guid.NewGuid();

View File

@@ -28,6 +28,7 @@ namespace Flax.Build.Projects.VisualStudio
case VisualStudioVersion.VisualStudio2017: return "v141";
case VisualStudioVersion.VisualStudio2019: return "v142";
case VisualStudioVersion.VisualStudio2022: return "v143";
case VisualStudioVersion.VisualStudio2026: return "v145";
}
return string.Empty;
}

View File

@@ -128,6 +128,8 @@ namespace Flax.Build.Projects.VisualStudio
version = VisualStudioVersion.VisualStudio2019;
else if (displayName.Contains("2022"))
version = VisualStudioVersion.VisualStudio2022;
else if (displayName.Contains("2026"))
version = VisualStudioVersion.VisualStudio2026;
else
{
Log.Warning(string.Format("Unknown Visual Studio installation. Display name: {0}", displayName));

View File

@@ -128,6 +128,7 @@ namespace Flax.Build.Projects.VisualStudio
case VisualStudioVersion.VisualStudio2017: return "15.0";
case VisualStudioVersion.VisualStudio2019: return "16.0";
case VisualStudioVersion.VisualStudio2022: return "17.0";
case VisualStudioVersion.VisualStudio2026: return "18.0";
}
return string.Empty;
@@ -193,7 +194,7 @@ namespace Flax.Build.Projects.VisualStudio
}
/// <inheritdoc />
public override string SolutionFileExtension => "sln";
public override string SolutionFileExtension => /*Version >= VisualStudioVersion.VisualStudio2026 ? "slnx" :*/ "sln";
/// <inheritdoc />
public override Project CreateProject()
@@ -277,6 +278,20 @@ namespace Flax.Build.Projects.VisualStudio
}
}
if (Version >= VisualStudioVersion.VisualStudio2026)
GenerateXmlSolution(solution);
else
GenerateAsciiSolution(solution);
}
private void GenerateXmlSolution(Solution solution)
{
// TODO: Generate the solution file in new format
GenerateAsciiSolution(solution);
}
private void GenerateAsciiSolution(Solution solution)
{
// Try to extract solution folder info from the existing solution file to make random IDs stable
var solutionId = Guid.NewGuid();
var folderIds = new Dictionary<string, Guid>();
@@ -313,7 +328,7 @@ namespace Flax.Build.Projects.VisualStudio
var projects = solution.Projects.Cast<VisualStudioProject>().ToArray();
// Header
if (Version == VisualStudioVersion.VisualStudio2022)
if (Version >= VisualStudioVersion.VisualStudio2022)
{
vcSolutionFileContent.AppendLine("Microsoft Visual Studio Solution File, Format Version 12.00");
vcSolutionFileContent.AppendLine("# Visual Studio Version 17");

View File

@@ -26,5 +26,10 @@ namespace Flax.Build.Projects.VisualStudio
/// The Visual Studio 2022.
/// </summary>
VisualStudio2022,
/// <summary>
/// The Visual Studio 2026.
/// </summary>
VisualStudio2026,
}
}

View File

@@ -648,6 +648,7 @@ namespace Flax.Build.Projects.VisualStudioCode
json.AddField("**/Screenshots", true);
json.AddField("**/Output", true);
json.AddField("**/*.flax", true);
json.AddField("**/Plugins", true);
json.EndObject();
// Extension settings
@@ -683,9 +684,15 @@ namespace Flax.Build.Projects.VisualStudioCode
json.EndObject();
// Referenced projects outside the current project (including engine too)
foreach (var project in Globals.Project.GetAllProjects())
var projects = Globals.Project.GetAllProjects();
// Move Engine to last for organizational purposes.
var engineProject = projects.First(x => x.Name == "Flax");
var projectsWithoutEngine = projects.Where(x => x.Name != "Flax");
projectsWithoutEngine = projectsWithoutEngine.OrderBy(x => x.Name);
var sortedProjects = projectsWithoutEngine.Concat([engineProject]);
foreach (var project in sortedProjects)
{
if (!project.ProjectFolderPath.Contains(Globals.Project.ProjectFolderPath))
if (!project.ProjectFolderPath.Equals(Globals.Project.ProjectFolderPath))
{
json.BeginObject();
{