151 lines
4.2 KiB
Lua
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
|