// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using System.Collections.Generic;
using System.IO;
using Flax.Build.Graph;
using Flax.Build.NativeCpp;
namespace Flax.Build.Platforms
{
///
/// The Microsoft Windows toolchain implementation.
///
///
///
public sealed class WindowsToolchain : WindowsToolchainBase
{
///
/// Initializes a new instance of the class.
///
/// The platform.
/// The target architecture.
public WindowsToolchain(WindowsPlatform platform, TargetArchitecture architecture)
: base(platform, architecture, WindowsPlatformToolset.Latest, WindowsPlatformSDK.Latest)
{
}
///
public override void SetupEnvironment(BuildOptions options)
{
base.SetupEnvironment(options);
options.CompileEnv.PreprocessorDefinitions.Add("PLATFORM_WINDOWS");
options.LinkEnv.InputLibraries.Add("dwmapi.lib");
options.LinkEnv.InputLibraries.Add("kernel32.lib");
options.LinkEnv.InputLibraries.Add("user32.lib");
options.LinkEnv.InputLibraries.Add("comdlg32.lib");
options.LinkEnv.InputLibraries.Add("advapi32.lib");
options.LinkEnv.InputLibraries.Add("shell32.lib");
options.LinkEnv.InputLibraries.Add("ole32.lib");
options.LinkEnv.InputLibraries.Add("oleaut32.lib");
options.LinkEnv.InputLibraries.Add("delayimp.lib");
}
///
public override void PreBuild(TaskGraph graph, BuildOptions options)
{
base.PreBuild(graph, options);
// Compile and include resource file if need to
if (options.Target.Win32ResourceFile != null && !options.Target.IsPreBuilt && options.Target.OutputType == TargetOutputType.Executable)
{
var task = graph.Add();
var args = new List();
var sourceFile = options.Target.Win32ResourceFile;
// Suppress Startup Banner
args.Add("/nologo");
// Language
args.Add("/l 0x0409");
// Add preprocessor definitions
foreach (var definition in options.CompileEnv.PreprocessorDefinitions)
{
args.Add(string.Format("/D \"{0}\"", definition));
}
// Add include paths
foreach (var includePath in options.CompileEnv.IncludePaths)
{
AddIncludePath(args, includePath);
}
// Add the resource file to the produced item list
var outputFile = Path.Combine(options.IntermediateFolder, Path.GetFileNameWithoutExtension(sourceFile) + ".res");
args.Add(string.Format("/Fo\"{0}\"", outputFile));
options.LinkEnv.InputFiles.Add(outputFile);
// Request included files to exist
var includes = IncludesCache.FindAllIncludedFiles(sourceFile);
task.PrerequisiteFiles.AddRange(includes);
// Add the source file
args.Add(string.Format("\"{0}\"", sourceFile));
task.ProducedFiles.Add(outputFile);
task.WorkingDirectory = options.WorkingDirectory;
task.CommandPath = _resourceCompilerPath;
task.CommandArguments = string.Join(" ", args);
task.PrerequisiteFiles.Add(sourceFile);
task.Cost = 1;
}
}
}
}