File: msvc-env.rb

package info (click to toggle)
google-perftools 2.18-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 10,616 kB
  • sloc: cpp: 78,788; ansic: 17,902; sh: 10,783; python: 4,278; makefile: 1,127; ruby: 198; asm: 130; awk: 12
file content (41 lines) | stat: -rw-r--r-- 1,329 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/ruby

# github docs point here. Maybe eventually we'll be able to discover
# it, so that when this path updates we don't have to edit our stuff.
BASE = 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise'

require 'json'

# MSVC and windows stuff is sick. Or maybe I am not aware of
# how to do it nicer. So what happens below?
#
# Well, we need environment variables setup as if vcvars64.bat is run
# (the one that does "cmd with visual studio environment whatever
# stuff"). "Thanks" to madness of cmd and .bat files I see no other
# way than to create .bat file, that will "call" vcvars thingy and
# then invoke ruby which will then dump environment variables we
# need. Then "outer" script handles unmarshalling and caching this.

Dir.chdir(File.dirname(__FILE__)) do
  h = begin
        JSON.parse(IO.read("env-cache"))
      rescue
        nil
      end
  unless h
    File.open("msvc-env.bat", "w") do |f|
      f.write(<<HERE)
@call "#{File.join(BASE, 'VC/Auxiliary/Build/vcvars64.bat')}"
@ruby -rjson -e "puts('!'*32); puts ENV.to_hash.to_json"
HERE
    end
    output = `msvc-env.bat`
    h = JSON.parse(output.split('!'*32, 2).last)
    File.open("env-cache", "w") {|f| f << h.to_json }
  end
  ENV.update(h)
end

# We then exec cmake/ninja as directed with environment variables updated

exec(*ARGV)