if (style == "windows") {
ToolchainProgram compiler = GetCCompiler ();
- if (compiler != null && compiler.ParentSDK != null) {
- if (compiler.IsVSToolChain && VisualStudioSDKHelper.GetInstance ().IsVisualStudio12 (compiler.ParentSDK) && static_link)
- Console.WriteLine ( @"Warning: Static linking the Mono runtime on Windows using VC " +
- @"12.0, won't support static Mono runtime library distributed in Mono SDK since it has " +
- @"been build using different C-runtime version. If build results in " +
- @"link errors related to C-runtime functions, please rebuild mono runtime distribution " +
- @"using targeted VC compiler and linker and rerun using MONOPREFIX.");
- }
-
bool staticLinkCRuntime = GetEnv ("VCCRT", "MD") != "MD";
if (!nomain || custom_main != null) {
string cl_cmd = GetCompileAndLinkCommand (compiler, temp_c, temp_o, custom_main, static_link, staticLinkCRuntime, output);
this.Name = name;
this.Version = Version.Parse (version);
this.InstallationFolder = installationFolder;
- this.IsSubVersion = false;
this.AdditionalSDKs = new List<InstalledSDKInfo> ();
}
}
class SDKHelper {
-
- protected Microsoft.Win32.RegistryKey GetToolchainRegistrySubKey (string subKey)
+ static protected Microsoft.Win32.RegistryKey GetToolchainRegistrySubKey (string subKey)
{
Microsoft.Win32.RegistryKey key = null;
}
class WindowsSDKHelper : SDKHelper {
-
List<InstalledSDKInfo> installedWindowsSDKs;
List<InstalledSDKInfo> installedCRuntimeSDKs;
InstalledSDKInfo installedWindowsSDK;
//Search for installed SDK versions.
if (Directory.Exists (winKitIncludeDir)) {
var winKitIncludeDirInfo = new DirectoryInfo (winKitIncludeDir);
- var versions = winKitIncludeDirInfo.GetDirectories (
- "*.*", SearchOption.TopDirectoryOnly).OrderByDescending (p => p.Name, new StringVersionComparer ());
+ var versions = winKitIncludeDirInfo.GetDirectories ("*.*", SearchOption.TopDirectoryOnly)
+ .OrderByDescending (p => p.Name, new StringVersionComparer ());
foreach (var version in versions) {
string versionedWindowsSDKHeaderPath = Path.Combine (version.FullName, "um", "windows.h");
if (winSDK.IsSubVersion) {
winSDKLibDir = Path.Combine (winSDKLibDir, winSDK.Version.ToString ());
} else {
- // Older WinSDK's header folders are not versioned, but installed libraries are, use latest availalble version for now.
+ // Older WinSDK's header folders are not versioned, but installed libraries are, use latest available version for now.
var winSDKLibDirInfo = new DirectoryInfo (winSDKLibDir);
- var versions = winSDKLibDirInfo.GetDirectories ("*.*", SearchOption.TopDirectoryOnly).OrderByDescending (p => p.Name, new StringVersionComparer ());
- if (versions != null && versions.First () != null)
- winSDKLibDir = versions.First ().FullName;
+ var version = winSDKLibDirInfo.GetDirectories ("*.*", SearchOption.TopDirectoryOnly)
+ .OrderByDescending (p => p.Name, new StringVersionComparer ()).FirstOrDefault ();
+ if (version != null)
+ winSDKLibDir = version.FullName;
}
//Enumerat lib sub folders.
}
class VisualStudioSDKHelper : SDKHelper {
-
List<InstalledSDKInfo> installedVisualStudioSDKs;
InstalledSDKInfo installedVisualStudioSDK;
{
string folderPath = "";
if (vcSDK != null && vcSDK.ParentSDK != null) {
- if (IsVisualStudio12 (vcSDK.ParentSDK) || IsVisualStudio14 (vcSDK.ParentSDK)) {
+ if (IsVisualStudio14 (vcSDK.ParentSDK)) {
folderPath = Path.Combine (vcSDK.InstallationFolder, subPath);
} else if (IsVisualStudio15 (vcSDK.ParentSDK)) {
string msvcVersionPath = Path.Combine (vcSDK.InstallationFolder, "Tools", "MSVC");
// Add latest found version of MSVC toolchain.
if (Directory.Exists (msvcVersionPath)) {
var msvcVersionDirInfo = new DirectoryInfo (msvcVersionPath);
- var versions = msvcVersionDirInfo.GetDirectories ("*.*", SearchOption.TopDirectoryOnly).OrderByDescending (p => p.Name, new StringVersionComparer ());
+ var versions = msvcVersionDirInfo.GetDirectories ("*.*", SearchOption.TopDirectoryOnly)
+ .OrderByDescending (p => p.Name, new StringVersionComparer ());
foreach (var version in versions) {
msvcVersionPath = Path.Combine (version.FullName, subPath);
string subPath = "";
if (vcSDK != null && vcSDK.ParentSDK != null) {
- if (IsVisualStudio12 (vcSDK.ParentSDK) || IsVisualStudio14 (vcSDK.ParentSDK))
+ if (IsVisualStudio14 (vcSDK.ParentSDK))
subPath = Target64BitApplication () ? @"lib\amd64" : "lib";
else if (IsVisualStudio15 (vcSDK.ParentSDK))
subPath = Target64BitApplication () ? @"lib\x64" : @"lib\x86";
return visualStudioVCSDK;
}
- public bool IsVisualStudio12 (InstalledSDKInfo vsSDK)
- {
- return vsSDK.Version.Major == 12 || vsSDK.Version.Major == 2013;
- }
-
public bool IsVisualStudio14 (InstalledSDKInfo vsSDK)
{
return vsSDK.Version.Major == 14 || vsSDK.Version.Major == 2015;
}
class VCToolchainProgram {
-
protected ToolchainProgram toolchain;
public virtual bool IsVersion (InstalledSDKInfo vcSDK) { return false; }
public virtual ToolchainProgram FindVCToolchainProgram (InstalledSDKInfo vcSDK) { return null; }
}
- class VC12ToolchainProgram : VCToolchainProgram {
-
+ class VC14ToolchainProgram : VCToolchainProgram {
public override bool IsVersion (InstalledSDKInfo vcSDK)
{
- return VisualStudioSDKHelper.GetInstance ().IsVisualStudio12 (vcSDK);
+ return VisualStudioSDKHelper.GetInstance ().IsVisualStudio14 (vcSDK);
}
protected ToolchainProgram FindVCToolchainProgram (string tool, InstalledSDKInfo vcSDK)
}
}
- class VC12Compiler : VC12ToolchainProgram {
+ class VC14Compiler : VC14ToolchainProgram {
public override ToolchainProgram FindVCToolchainProgram (InstalledSDKInfo vcSDK)
{
return FindVCToolchainProgram ("cl.exe", vcSDK);
}
}
- class VC14Compiler : VC12Compiler {
- public override bool IsVersion (InstalledSDKInfo vcSDK)
- {
- return VisualStudioSDKHelper.GetInstance ().IsVisualStudio14 (vcSDK);
- }
- }
-
class VC15Compiler : VC15ToolchainProgram {
public override ToolchainProgram FindVCToolchainProgram (InstalledSDKInfo vcSDK)
{
}
}
- class VC12Librarian : VC12ToolchainProgram {
+ class VC14Librarian : VC14ToolchainProgram {
public override ToolchainProgram FindVCToolchainProgram (InstalledSDKInfo vcSDK)
{
return FindVCToolchainProgram ("lib.exe", vcSDK);
}
}
- class VC14Librarian : VC12Compiler {
- public override bool IsVersion (InstalledSDKInfo vcSDK)
- {
- return VisualStudioSDKHelper.GetInstance ().IsVisualStudio14 (vcSDK);
- }
- }
-
class VC15Librarian : VC15ToolchainProgram {
public override ToolchainProgram FindVCToolchainProgram (InstalledSDKInfo vcSDK)
{
public VisualStudioSDKToolchainHelper ()
{
- vcCompilers.Add (new VC12Compiler ());
vcCompilers.Add (new VC14Compiler ());
vcCompilers.Add (new VC15Compiler ());
- vcLibrarians.Add (new VC12Librarian ());
vcLibrarians.Add (new VC14Librarian ());
vcLibrarians.Add (new VC15Librarian ());
ToolchainProgram GetVCToolChainProgram (List<VCToolchainProgram> programs)
{
- ToolchainProgram program = null;
var vcSDK = VisualStudioSDKHelper.GetInstance ().GetInstalledVisualStudioVCSDK ();
if (vcSDK?.ParentSDK != null) {
foreach (var item in programs) {
if (item.IsVersion (vcSDK.ParentSDK)) {
- program = item.FindVCToolchainProgram (vcSDK);
- break;
+ return item.FindVCToolchainProgram (vcSDK);
}
}
}
- return program;
+ return null;
}
public ToolchainProgram GetVCCompiler ()
linkerArgs.Add ("user32.lib");
linkerArgs.Add ("advapi32.lib");
- if (program != null && program.ParentSDK != null && VisualStudioSDKHelper.GetInstance ().IsVisualStudio12 (program.ParentSDK)) {
- if (staticLinkCRuntime) {
- // Static release c-runtime support.
- linkerArgs.Add ("libcmt.lib");
- linkerArgs.Add ("oldnames.lib");
- } else {
- // Dynamic release c-runtime support.
- linkerArgs.Add ("msvcrt.lib");
- linkerArgs.Add ("oldnames.lib");
- }
+ if (staticLinkCRuntime) {
+ // Static release c-runtime support.
+ linkerArgs.Add ("libucrt.lib");
+ linkerArgs.Add ("libvcruntime.lib");
+ linkerArgs.Add ("libcmt.lib");
+ linkerArgs.Add ("oldnames.lib");
} else {
- if (staticLinkCRuntime) {
- // Static release c-runtime support.
- linkerArgs.Add ("libucrt.lib");
- linkerArgs.Add ("libvcruntime.lib");
- linkerArgs.Add ("libcmt.lib");
- linkerArgs.Add ("oldnames.lib");
- } else {
- // Dynamic release c-runtime support.
- linkerArgs.Add ("ucrt.lib");
- linkerArgs.Add ("vcruntime.lib");
- linkerArgs.Add ("msvcrt.lib");
- linkerArgs.Add ("oldnames.lib");
- }
+ // Dynamic release c-runtime support.
+ linkerArgs.Add ("ucrt.lib");
+ linkerArgs.Add ("vcruntime.lib");
+ linkerArgs.Add ("msvcrt.lib");
+ linkerArgs.Add ("oldnames.lib");
}
return;
return new ToolchainProgram ("AS", assembler);
var vcClangAssembler = VisualStudioSDKToolchainHelper.GetInstance ().GetVCClangCompiler ();
- if (vcClangAssembler == null)
+ if (vcClangAssembler == null) {
// Fallback to GNU assembler if clang for VS was not installed.
// Why? because mkbundle generates GNU assembler not compilable by VS tools like ml.
+ Console.WriteLine (@"Warning: Couldn't find installed Visual Studio SDK, fallback to as.exe and default environment.");
return new ToolchainProgram ("AS", "as.exe");
+ }
return vcClangAssembler;
}
return new ToolchainProgram ("CC", compiler);
var vcCompiler = VisualStudioSDKToolchainHelper.GetInstance ().GetVCCompiler ();
- if (vcCompiler == null)
+ if (vcCompiler == null) {
// Fallback to cl.exe if VC compiler was not installed.
+ Console.WriteLine (@"Warning: Couldn't find installed Visual Studio SDK, fallback to cl.exe and default environment.");
return new ToolchainProgram ("cl.exe", "cl.exe");
+ }
return vcCompiler;
}
static ToolchainProgram GetLibrarian ()
{
ToolchainProgram vcLibrarian = VisualStudioSDKToolchainHelper.GetInstance ().GetVCLibrarian ();
- if (vcLibrarian == null)
+ if (vcLibrarian == null) {
// Fallback to lib.exe if VS was not installed.
+ Console.WriteLine (@"Warning: Couldn't find installed Visual Studio SDK, fallback to lib.exe and default environment.");
return new ToolchainProgram ("lib.exe", "lib.exe");
+ }
return vcLibrarian;
}
// Add linker arguments.
AddLinkerArguments (compiler, staticLinkMono, staticLinkCRuntime, customMain, outputFile, compilerArgs);
- return String.Format ("{0} {1}", compiler.QuoteArg (compiler.Path), String.Join (" ", compilerArgs.ToArray ()));
+ return String.Format ("{0} {1}", compiler.QuoteArg (compiler.Path), String.Join (" ", compilerArgs));
}
static string GetLibrarianCompilerCommand (ToolchainProgram compiler, string sourceFile, bool staticLinkMono, bool staticLinkCRuntime, out string objectFile)
else
AddGCCLibrarianCompilerArguments (compiler, sourceFile, staticLinkMono, staticLinkCRuntime, compilerArgs, out objectFile);
- return String.Format ("{0} {1}", compiler.QuoteArg (compiler.Path), String.Join (" ", compilerArgs.ToArray ()));
+ return String.Format ("{0} {1}", compiler.QuoteArg (compiler.Path), String.Join (" ", compilerArgs));
}
static string GetLibrarianLinkerCommand (ToolchainProgram librarian, string [] objectFiles, bool staticLinkMono, bool staticLinkCRuntime, string outputFile)
else
AddGCCLibrarianLinkerArguments (librarian, objectFiles, staticLinkMono, staticLinkCRuntime, outputFile, librarianArgs);
- return String.Format ("{0} {1}", librarian.QuoteArg (librarian.Path), String.Join (" ", librarianArgs.ToArray ()));
+ return String.Format ("{0} {1}", librarian.QuoteArg (librarian.Path), String.Join (" ", librarianArgs));
}
#endregion
}