-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
win: find and setup for VS2017 #1130
Closed
Closed
Changes from 8 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
1f79c98
win: find and setup for VS2017
refack 2dd811b
fixup: unnecessary require
joaocgreis 034a330
fixup: change MSBuild dependency
joaocgreis 5a06bef
fixup: s/const/var
joaocgreis 5faa488
fixup: De Morgan
joaocgreis e1cc9ec
fixup: comment
joaocgreis 4860d72
fixup: async, v0.10 compatible (using execFile)
joaocgreis e353a28
fixup: attribution
joaocgreis 4d0b91f
fixup: Find-VS2017.cs API update
joaocgreis File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,265 @@ | ||
// Copyright 2017 - Refael Ackermann | ||
// Distributed under MIT style license | ||
// See accompanying file LICENSE at https://github.com/node4good/windows-autoconf | ||
// powershell -ExecutionPolicy Unrestricted -Version "2.0" -Command "&{Add-Type -Path Find-VS2017.cs; [VisualStudioConfiguration.Main]::Query()}" | ||
using System; | ||
using System.Text; | ||
using System.Runtime.InteropServices; | ||
|
||
namespace VisualStudioConfiguration | ||
{ | ||
[Flags] | ||
public enum InstanceState : uint | ||
{ | ||
None = 0, | ||
Local = 1, | ||
Registered = 2, | ||
NoRebootRequired = 4, | ||
NoErrors = 8, | ||
Complete = 4294967295, | ||
} | ||
|
||
[Guid("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface IEnumSetupInstances | ||
{ | ||
|
||
void Next([MarshalAs(UnmanagedType.U4), In] int celt, | ||
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Interface), Out] ISetupInstance[] rgelt, | ||
[MarshalAs(UnmanagedType.U4)] out int pceltFetched); | ||
|
||
void Skip([MarshalAs(UnmanagedType.U4), In] int celt); | ||
|
||
void Reset(); | ||
|
||
[return: MarshalAs(UnmanagedType.Interface)] | ||
IEnumSetupInstances Clone(); | ||
} | ||
|
||
[Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface ISetupConfiguration | ||
{ | ||
} | ||
|
||
[Guid("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface ISetupConfiguration2 : ISetupConfiguration | ||
{ | ||
|
||
[return: MarshalAs(UnmanagedType.Interface)] | ||
IEnumSetupInstances EnumInstances(); | ||
|
||
[return: MarshalAs(UnmanagedType.Interface)] | ||
ISetupInstance GetInstanceForCurrentProcess(); | ||
|
||
[return: MarshalAs(UnmanagedType.Interface)] | ||
ISetupInstance GetInstanceForPath([MarshalAs(UnmanagedType.LPWStr), In] string path); | ||
|
||
[return: MarshalAs(UnmanagedType.Interface)] | ||
IEnumSetupInstances EnumAllInstances(); | ||
} | ||
|
||
[Guid("B41463C3-8866-43B5-BC33-2B0676F7F42E")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface ISetupInstance | ||
{ | ||
} | ||
|
||
[Guid("89143C9A-05AF-49B0-B717-72E218A2185C")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface ISetupInstance2 : ISetupInstance | ||
{ | ||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetInstanceId(); | ||
|
||
[return: MarshalAs(UnmanagedType.Struct)] | ||
System.Runtime.InteropServices.ComTypes.FILETIME GetInstallDate(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetInstallationName(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetInstallationPath(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetInstallationVersion(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetDisplayName([MarshalAs(UnmanagedType.U4), In] int lcid); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetDescription([MarshalAs(UnmanagedType.U4), In] int lcid); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string ResolvePath([MarshalAs(UnmanagedType.LPWStr), In] string pwszRelativePath); | ||
|
||
[return: MarshalAs(UnmanagedType.U4)] | ||
InstanceState GetState(); | ||
|
||
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)] | ||
ISetupPackageReference[] GetPackages(); | ||
|
||
ISetupPackageReference GetProduct(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetProductPath(); | ||
|
||
[return: MarshalAs(UnmanagedType.VariantBool)] | ||
bool IsLaunchable(); | ||
|
||
[return: MarshalAs(UnmanagedType.VariantBool)] | ||
bool IsComplete(); | ||
|
||
ISetupPropertyStore GetProperties(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetEnginePath(); | ||
} | ||
|
||
[Guid("DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface ISetupPackageReference | ||
{ | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetId(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetVersion(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetChip(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetLanguage(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetBranch(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetType(); | ||
|
||
[return: MarshalAs(UnmanagedType.BStr)] | ||
string GetUniqueId(); | ||
|
||
[return: MarshalAs(UnmanagedType.VariantBool)] | ||
bool GetIsExtension(); | ||
} | ||
|
||
[Guid("c601c175-a3be-44bc-91f6-4568d230fc83")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
[ComImport] | ||
public interface ISetupPropertyStore | ||
{ | ||
|
||
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] | ||
string[] GetNames(); | ||
|
||
object GetValue([MarshalAs(UnmanagedType.LPWStr), In] string pwszName); | ||
} | ||
|
||
[Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")] | ||
[CoClass(typeof(SetupConfigurationClass))] | ||
[ComImport] | ||
public interface SetupConfiguration : ISetupConfiguration2, ISetupConfiguration | ||
{ | ||
} | ||
|
||
[Guid("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D")] | ||
[ClassInterface(ClassInterfaceType.None)] | ||
[ComImport] | ||
public class SetupConfigurationClass | ||
{ | ||
} | ||
|
||
public static class Main | ||
{ | ||
public static void Query() | ||
{ | ||
ISetupConfiguration query = new SetupConfiguration(); | ||
ISetupConfiguration2 query2 = (ISetupConfiguration2)query; | ||
IEnumSetupInstances e = query2.EnumAllInstances(); | ||
|
||
int pceltFetched; | ||
ISetupInstance2[] rgelt = new ISetupInstance2[1]; | ||
StringBuilder log = new StringBuilder(); | ||
while (true) | ||
{ | ||
e.Next(1, rgelt, out pceltFetched); | ||
if (pceltFetched <= 0) | ||
{ | ||
Console.WriteLine(String.Format("{{\"log\":\"{0}\"}}", log.ToString())); | ||
return; | ||
} | ||
if (CheckInstance(rgelt[0], ref log)) | ||
return; | ||
} | ||
} | ||
|
||
private static bool CheckInstance(ISetupInstance2 setupInstance2, ref StringBuilder log) | ||
{ | ||
// Visual Studio Community 2017 component directory: | ||
// https://www.visualstudio.com/en-us/productinfo/vs2017-install-product-Community.workloads | ||
|
||
string path = setupInstance2.GetInstallationPath().Replace("\\", "\\\\"); | ||
log.Append(String.Format("Found installation at: {0}\\n", path)); | ||
|
||
bool hasMSBuild = false; | ||
bool hasVCTools = false; | ||
uint Win10SDKVer = 0; | ||
bool hasWin8SDK = false; | ||
|
||
foreach (ISetupPackageReference package in setupInstance2.GetPackages()) | ||
{ | ||
const string Win10SDKPrefix = "Microsoft.VisualStudio.Component.Windows10SDK."; | ||
|
||
string id = package.GetId(); | ||
if (id == "Microsoft.VisualStudio.VC.MSBuild.Base") | ||
hasMSBuild = true; | ||
else if (id == "Microsoft.VisualStudio.Component.VC.Tools.x86.x64") | ||
hasVCTools = true; | ||
else if (id.StartsWith(Win10SDKPrefix)) | ||
Win10SDKVer = Math.Max(Win10SDKVer, UInt32.Parse(id.Substring(Win10SDKPrefix.Length))); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Bug found with new SDK #1144 |
||
else if (id == "Microsoft.VisualStudio.Component.Windows81SDK") | ||
hasWin8SDK = true; | ||
else | ||
continue; | ||
|
||
log.Append(String.Format(" - Found {0}\\n", id)); | ||
} | ||
|
||
if (!hasMSBuild) | ||
log.Append(" - Missing Visual Studio C++ core features (Microsoft.VisualStudio.VC.MSBuild.Base)\\n"); | ||
if (!hasVCTools) | ||
log.Append(" - Missing VC++ 2017 v141 toolset (x86,x64) (Microsoft.VisualStudio.Component.VC.Tools.x86.x64)\\n"); | ||
if ((Win10SDKVer == 0) && (!hasWin8SDK)) | ||
log.Append(" - Missing a Windows SDK (Microsoft.VisualStudio.Component.Windows10SDK.* or Microsoft.VisualStudio.Component.Windows81SDK)\\n"); | ||
|
||
if (hasMSBuild && hasVCTools) | ||
{ | ||
if (Win10SDKVer > 0) | ||
{ | ||
log.Append(" - Using this installation with Windows 10 SDK"/*\\n*/); | ||
Console.WriteLine(String.Format("{{\"log\":\"{0}\",\"path\":\"{1}\",\"sdk\":\"10.0.{2}.0\"}}", log.ToString(), path, Win10SDKVer)); | ||
return true; | ||
} | ||
else if (hasWin8SDK) | ||
{ | ||
log.Append(" - Using this installation with Windows 8.1 SDK"/*\\n*/); | ||
Console.WriteLine(String.Format("{{\"log\":\"{0}\",\"path\":\"{1}\",\"sdk\":\"8.1\"}}", log.ToString(), path)); | ||
return true; | ||
} | ||
} | ||
|
||
log.Append(" - Some required components are missing, not using this installation\\n"); | ||
return false; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does this file need source attribution and/or copyright? or is it ours?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was submitted by @refack in #1103 , I believe it was adapted from the python COM API by @bzoz in #1101 , which in turn got the GUIDs and API from the nuget package upstream. @refack can you confim?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wrote it myself. GUIDs extracted from interop
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I recommend using updated file https://github.com/node4good/windows-autoconf/blob/master/tools/GetVS2017Configuration.cs