visual_studio 0.1.0.2 → 0.1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/visual_studio.rb +6 -3
- data/lib/visual_studio/environment.rb +15 -2
- data/lib/visual_studio/gem.rb +1 -1
- data/lib/visual_studio/product.rb +86 -31
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b96d8f75ac42d55c4d980ff6ee7c4d4647262e3
|
4
|
+
data.tar.gz: f595c1b74a1b1668af5a686ee1ac433840fcbf04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25da97f68cc5e58df1e967c0812b4b55484a1a43213beb44b27861e3278e8fd047df668a430b3185f52ec4984db7eae22a19c4cc11a4868b570d0a99eb8f9ea7
|
7
|
+
data.tar.gz: dd545f94acad51d0e08f20ba74717a36d87f54f4ece1a98bac22f02d130d3ef8b4b2094800243ca26e19af40ce7a95797bd4807fed5c51484845ff8c2438d115
|
data/lib/visual_studio.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
module VisualStudio
|
2
2
|
NAMES = ['vs2015', 'vs2013', 'vs2012', 'vs2010', 'vs2008', 'vs2005']
|
3
3
|
|
4
|
-
PRETTY_NAMES = ['Visual Studio 2015',
|
5
|
-
'Visual Studio
|
6
|
-
'Visual Studio
|
4
|
+
PRETTY_NAMES = ['Visual Studio 2015',
|
5
|
+
'Visual Studio 2013',
|
6
|
+
'Visual Studio 2012',
|
7
|
+
'Visual Studio 2010',
|
8
|
+
'Visual Studio 2008',
|
9
|
+
'Visual Studio 2005']
|
7
10
|
|
8
11
|
VERSIONS = [14.0, 12.0, 11.0, 10.0, 9.0, 8.0].map(&:to_s)
|
9
12
|
|
@@ -3,10 +3,14 @@ module VisualStudio
|
|
3
3
|
SEARCH_DIRECTORIES = ['PATH', 'INCLUDE', 'LIB', 'LIBPATH']
|
4
4
|
|
5
5
|
def self.merge(base, overlay)
|
6
|
+
# We merge case insensitively, because Windows. We treat |base| case as canonical
|
7
|
+
# unless the variable is only named by |overlay|.
|
8
|
+
cased = (overlay.keys + base.keys).uniq.map{|key| [key.upcase, key]}.to_h
|
9
|
+
|
6
10
|
# TODO(mtwilliams): Verify match-up between VCInstallDir and VisualStudioVersion?
|
7
11
|
# TODO(mtwilliams): Rederive environment variables based on VCInstallDir and/or WindowsSdkDir.
|
8
|
-
env = base.
|
9
|
-
if SEARCH_DIRECTORIES.include? variable
|
12
|
+
env = canonicalize(base).merge(canonicalize(overlay)) do |variable, base, overlay|
|
13
|
+
if SEARCH_DIRECTORIES.include? variable.upcase
|
10
14
|
# TODO(mtwilliams): Detect new Visual Studio or Windows SDK related
|
11
15
|
# paths and replace the old ones based on that.
|
12
16
|
base = base.split(';')
|
@@ -29,6 +33,15 @@ module VisualStudio
|
|
29
33
|
overlay
|
30
34
|
end
|
31
35
|
end
|
36
|
+
|
37
|
+
env.map { |canonical, value|
|
38
|
+
[cased[canonical], value]
|
39
|
+
}.to_h
|
32
40
|
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def self.canonicalize(environment)
|
44
|
+
environment.to_h.map{|key, value| [key.upcase, value]}.to_h
|
45
|
+
end
|
33
46
|
end
|
34
47
|
end
|
data/lib/visual_studio/gem.rb
CHANGED
@@ -11,7 +11,8 @@ module VisualStudio
|
|
11
11
|
:libraries,
|
12
12
|
:binaries,
|
13
13
|
:sdks,
|
14
|
-
:supports
|
14
|
+
:supports,
|
15
|
+
:shared
|
15
16
|
|
16
17
|
def initialize(desc)
|
17
18
|
@name = desc[:name]
|
@@ -22,33 +23,77 @@ module VisualStudio
|
|
22
23
|
@binaries = desc[:binaries]
|
23
24
|
@sdks = desc[:sdks]
|
24
25
|
@supports = desc[:supports]
|
26
|
+
@shared = desc[:shared]
|
25
27
|
end
|
26
28
|
|
27
29
|
def environment(opts={})
|
28
30
|
# TODO(mtwilliams): Raise an exception.
|
29
31
|
return nil unless @name.to_s == 'VC'
|
30
32
|
|
31
|
-
# HACK(mtwilliams): We should reimplement this logic inside this gem.
|
32
|
-
require 'open3'
|
33
|
-
require 'json'
|
34
|
-
|
35
33
|
target = opts[:target] || {platform: :windows,
|
36
34
|
architecture: :x86}
|
35
|
+
|
37
36
|
# TODO(mtwilliams): Handle other platforms.
|
37
|
+
# TODO(mtwilliams): Check if the architecture is supported.
|
38
38
|
platform = :windows
|
39
39
|
arch = {:x86 => 'x86', :x86_64 => 'amd64', :arm => 'arm'}[target[:architecture]]
|
40
|
-
# TODO(mtwilliams): Check if the architecture is supported.
|
41
|
-
# @supports.include?(target[:architecture])
|
42
40
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
# TODO(mtwilliams): Raise an exception.
|
42
|
+
return nil unless arch
|
43
|
+
|
44
|
+
if @shared
|
45
|
+
# HACK(mtwilliams): Microsoft shipped a broken `vcvarsall.bat`, so
|
46
|
+
# we need to build the envrionment ourself.
|
47
|
+
|
48
|
+
root = File.expand_path(File.join(@root, ".."))
|
49
|
+
|
50
|
+
# TODO(mtwilliams): Insert missing variables into environment.
|
51
|
+
# WindowsSdkDir
|
52
|
+
# WindowsLibPath
|
53
|
+
# WindowsSDKVersion
|
54
|
+
# UCRTVersion
|
55
|
+
# UniversalCRTSdkDir
|
56
|
+
# DevEnvDir
|
57
|
+
# INCLUDE
|
58
|
+
# LIB
|
59
|
+
# LIBPATH
|
60
|
+
|
61
|
+
path = []
|
62
|
+
|
63
|
+
# TODO(mtwilliams): Inject latest Windows SDK into PATH.
|
64
|
+
case arch
|
65
|
+
when 'x86'
|
66
|
+
path << File.join(@root, "bin")
|
67
|
+
else
|
68
|
+
path << File.join(@root, "bin", arch)
|
69
|
+
end
|
70
|
+
|
71
|
+
env = {
|
72
|
+
"VS140COMNTOOLS" => File.join(root, "Common7", "Tools"),
|
73
|
+
"VSINSTALLDIR" => root,
|
74
|
+
"VCINSTALLDIR" => File.join(root, "VC"),
|
75
|
+
"PATH" => path.join(';')
|
76
|
+
}
|
77
|
+
|
78
|
+
env = VisualStudio::Environment.merge(opts[:base] || {}, env)
|
79
|
+
env = VisualStudio::Environment.merge(env, opts[:overlay] || {})
|
80
|
+
|
81
|
+
env
|
82
|
+
else
|
83
|
+
# HACK(mtwilliams): We should reimplement this logic inside this gem.
|
84
|
+
require 'open3'
|
85
|
+
require 'json'
|
47
86
|
|
48
|
-
|
49
|
-
|
87
|
+
cmd = "call \"#{File.join(@root, 'vcvarsall.bat')}\" #{arch} & " +
|
88
|
+
"echo require('json'); print JSON.generate(ENV.to_h); | ruby\n"
|
89
|
+
out, _, status = Open3.capture3(ENV.to_h, "cmd.exe /C \"#{cmd}\"")
|
90
|
+
return nil unless status == 0
|
50
91
|
|
51
|
-
|
92
|
+
env = VisualStudio::Environment.merge(opts[:base] || {}, JSON.parse(out))
|
93
|
+
env = VisualStudio::Environment.merge(env, opts[:overlay] || {})
|
94
|
+
|
95
|
+
env
|
96
|
+
end
|
52
97
|
end
|
53
98
|
|
54
99
|
def self.find(product, version)
|
@@ -59,6 +104,10 @@ module VisualStudio
|
|
59
104
|
root = self._find_via_registry(product, version)
|
60
105
|
return nil if root.nil?
|
61
106
|
|
107
|
+
# If shared, indicates everything is fucked up and Microsoft can't be
|
108
|
+
# trusted. As such, we need to unfuck things downstream.
|
109
|
+
shared = root.downcase.include? 'shared'
|
110
|
+
|
62
111
|
includes, libraries, binaries =
|
63
112
|
case product
|
64
113
|
when 'VC'
|
@@ -120,7 +169,8 @@ module VisualStudio
|
|
120
169
|
binaries: binaries,
|
121
170
|
sdks: ({windows: sdks}),
|
122
171
|
supports: ({platforms: platforms,
|
123
|
-
architectures: architectures})
|
172
|
+
architectures: architectures}),
|
173
|
+
shared: shared)
|
124
174
|
else
|
125
175
|
# TODO(mtwilliams): Raise an exception.
|
126
176
|
# raise VisualStudio::InvalidVersion.new(...)
|
@@ -129,22 +179,27 @@ module VisualStudio
|
|
129
179
|
|
130
180
|
private
|
131
181
|
def self._find_via_registry(product, version)
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
182
|
+
case version.to_f
|
183
|
+
when 8.0..14.0
|
184
|
+
# We try to find a full version of Visual Studio. If we can't, then
|
185
|
+
# we look for standalone verions, i.e. Express Editions. This is only
|
186
|
+
# required for 2005-2010 so this logic can be removed when we drop
|
187
|
+
# support for them.
|
188
|
+
keys = ["SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\#{version}\\Setup\\#{product}",
|
189
|
+
"SOFTWARE\\Microsoft\\VisualStudio\\#{version}\\Setup\\#{product}",
|
190
|
+
"SOFTWARE\\Wow6432Node\\Microsoft\\VCExpress\\#{version}\\Setup\\#{product}",
|
191
|
+
"SOFTWARE\\Microsoft\\VCExpress\\#{version}\\Setup\\#{product}"]
|
192
|
+
installs = keys.map do |key|
|
193
|
+
begin
|
194
|
+
require 'win32/registry'
|
195
|
+
return File.expand_path(::Win32::Registry::HKEY_LOCAL_MACHINE.open(key, ::Win32::Registry::KEY_READ)['ProductDir']).to_s
|
196
|
+
rescue
|
197
|
+
end
|
198
|
+
end
|
199
|
+
installs.compact.first
|
200
|
+
when 15.0
|
201
|
+
raise "Not supported yet!"
|
202
|
+
end
|
148
203
|
end
|
149
204
|
end
|
150
205
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visual_studio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -93,9 +93,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
version: '0'
|
94
94
|
requirements: []
|
95
95
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.
|
96
|
+
rubygems_version: 2.6.11
|
97
97
|
signing_key:
|
98
98
|
specification_version: 4
|
99
99
|
summary: Inspect Visual Studio installs and generate Visual Studio project files.
|
100
100
|
test_files: []
|
101
|
-
has_rdoc:
|