2014-09-14 08:36:58 +02:00

151 lines
4.2 KiB
Lua

-- msvc-winsdk.lua - Use Microsoft Windows SDK 7.1 or later to build.
module(..., package.seeall)
local native = require "tundra.native"
local os = require "os"
if native.host_platform ~= "windows" then
error("the msvc toolset only works on windows hosts")
end
local function get_host_arch()
local snative = native.getenv("PROCESSOR_ARCHITECTURE")
local swow = native.getenv("PROCESSOR_ARCHITEW6432", "")
if snative == "AMD64" or swow == "AMD64" then
return "x64"
elseif snative == "IA64" or swow == "IA64" then
return "itanium";
else
return "x86"
end
end
local compiler_dirs = {
["x86"] = {
["x86"] = "bin\\",
["x64"] = "bin\\x86_amd64\\",
["itanium"] = "bin\\x86_ia64\\",
},
["x64"] = {
["x86"] = "bin\\",
["x64"] = {
["11.0"] = "bin\\x86_amd64\\",
"bin\\amd64\\"
},
["itanium"] = "bin\\x86_ia64\\",
},
["itanium"] = {
["x86"] = "bin\\x86_ia64\\",
["itanium"] = "bin\\ia64\\",
},
}
local function setup(env, options)
options = options or {}
local target_arch = options.TargetArch or "x86"
local host_arch = options.HostArch or get_host_arch()
local vcversion = options.VcVersion or "10.0"
local binDir =
compiler_dirs[host_arch][target_arch][vcversion]
or compiler_dirs[host_arch][target_arch][1]
or compiler_dirs[host_arch][target_arch]
if not binDir then
errorf("can't build target arch %s on host arch %s", target_arch, host_arch)
end
local sdkDir;
local sdkDirIncludes;
local sdkLibDir;
local vcLibDir;
if vcversion == "11.0" then
local sdk_key = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v8.0"
sdkDir = assert(native.reg_query("HKLM", sdk_key, "InstallationFolder"))
sdkDirIncludes = { sdkDir .. "\\INCLUDE\\UM", sdkDir .. "\\INCLUDE\\SHARED" }
sdkLibDir = "LIB\\win8\\um\\"
vcLibDir = "LIB"
if "x86" == target_arch then
sdkLibDir = sdkLibDir .. "x86"
elseif "x64" == target_arch then
sdkLibDir = sdkLibDir .. "x64"
vcLibDir = "LIB\\amd64"
elseif "arm" == target_arch then
sdkLibDir = sdkLibDir .. "arm"
end
else
local sdk_key = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows"
sdkDir = assert(native.reg_query("HKLM", sdk_key, "CurrentInstallFolder"))
sdkDirIncludes = { sdkDir .. "\\INCLUDE" };
sdkLibDir = "LIB"
vcLibDir = "LIB"
if "x64" == target_arch then
sdkLibDir = "LIB\\x64"
vcLibDir = "LIB\\amd64"
elseif "itanium" == target_arch then
sdkLibDir = "LIB\\IA64"
vcLibDir = "LIB\\IA64"
end
end
local vc_key = "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7"
local vc_dir = assert(native.reg_query("HKLM", vc_key, vcversion))
if vc_dir:sub(-1) ~= '\\' then
vc_dir = vc_dir .. '\\'
end
local cl_exe = '"' .. vc_dir .. binDir .. "cl.exe" ..'"'
local lib_exe = '"' .. vc_dir .. binDir .. "lib.exe" ..'"'
local link_exe = '"' .. vc_dir .. binDir .. "link.exe" ..'"'
env:set('CC', cl_exe)
env:set('CXX', cl_exe)
env:set('LIB', lib_exe)
env:set('LD', link_exe)
-- Set up the MS SDK associated with visual studio
env:set_external_env_var("WindowsSdkDir", sdkDir)
env:set_external_env_var("INCLUDE", table.concat(sdkDirIncludes, ";") .. ";" .. vc_dir .. "\\INCLUDE")
local rc_exe
print("vcversion", vcversion)
if vcversion == "11.0" then
rc_exe = '"' .. sdkDir .. "\\bin\\x86\\rc.exe" ..'"'
else
rc_exe = '"' .. sdkDir .. "\\bin\\rc.exe" ..'"'
end
env:set('RC', rc_exe)
local libString = sdkDir .. "\\" .. sdkLibDir .. ";" .. vc_dir .. "\\" .. vcLibDir
env:set_external_env_var("LIB", libString)
env:set_external_env_var("LIBPATH", libString)
local path = { }
local vc_root = vc_dir:sub(1, -4)
if binDir ~= "\\bin\\" then
path[#path + 1] = vc_dir .. "\\bin"
end
path[#path + 1] = vc_root .. "Common7\\Tools" -- drop vc\ at end
path[#path + 1] = vc_root .. "Common7\\IDE" -- drop vc\ at end
path[#path + 1] = sdkDir
path[#path + 1] = vc_dir .. binDir
path[#path + 1] = env:get_external_env_var('PATH')
env:set_external_env_var("PATH", table.concat(path, ';'))
end
function apply(env, options)
-- Load basic MSVC environment setup first. We're going to replace the paths to
-- some tools.
tundra.unitgen.load_toolset('msvc', env)
setup(env, options)
end