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)
|