aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXpol Wan <xpolife@gmail.com>2015-11-01 13:35:33 +0800
committerXpol Wan <xpolife@gmail.com>2015-11-01 13:35:33 +0800
commit4c3b41e765cf42afecfba8e32965e5c057c96870 (patch)
treefc3c2c4b3dbfbbad6531ae50e2ee3ea1703568fb
parent00184f35d70af9b2cf746e8a2de156d06c88101b (diff)
downloadluarocks-4c3b41e765cf42afecfba8e32965e5c057c96870.tar.gz
luarocks-4c3b41e765cf42afecfba8e32965e5c057c96870.tar.bz2
luarocks-4c3b41e765cf42afecfba8e32965e5c057c96870.zip
Add support for Windows SDK v7.1 and v6.1.
Other Windows SDK versions requires a separate installation of Visual Studio.
-rw-r--r--install.bat84
1 files changed, 60 insertions, 24 deletions
diff --git a/install.bat b/install.bat
index cfc5f074..0514af1b 100644
--- a/install.bat
+++ b/install.bat
@@ -411,48 +411,84 @@ end
411 411
412-- get a string value from windows registry. 412-- get a string value from windows registry.
413local function get_registry(key, value) 413local function get_registry(key, value)
414 local h = io.popen('reg query "'..key..'" /v '..value..' 2>NUL') 414 local keys = {key}
415 local output = h:read('*a') 415 local key64, replaces = key:gsub("(%u+\\SOFTWARE\\)", "\1Wow6432Node\\", 1)
416 h:close() 416 if replaces == 0 then
417 key64, replaces = key:gsub("(%u+\\Software\\)", "\1Wow6432Node\\", 1)
418 end
417 419
418 return output:match('REG_SZ%s+([^\n]+)') 420 if replaces == 1 then
419end 421 table.insert(keys, 1, key64)
422 end
423
424 for _, k in ipairs(keys) do
425 local h = io.popen('reg query "'..k..'" /v '..value..' 2>NUL')
426 local output = h:read('*a')
427 h:close()
420 428
421local function visual_studio_registry_key(major, minor) 429 local v = output:match('REG_SZ%s+([^\n]+)')
422 local key = "HKLM\\SOFTWARE%s\\Microsoft\\VisualStudio\\%d.%d\\Setup\\VC" 430 if v then
423 -- os.getenv('PROCESSOR_ARCHITECTURE') will always return 'x86' if lua interpreter is 32 bit. 431 return v
424 local hostx64 = os.getenv("ProgramFiles(x86)")~=nil 432 end
425 return key:format(hostx64 and "\\Wow6432Node" or "", major, minor) 433 end
434 return nil
426end 435end
427 436
428-- requires vars.LUA_RUNTIME to be set before calling this function. 437-- requires vars.LUA_RUNTIME to be set before calling this function.
429local function get_visual_studio_directory() 438local function get_visual_studio_directory()
430 local major, minor = vars.LUA_RUNTIME:match('VCR%u*(%d+)(%d)$') -- MSVCR<x><y> or VCRUNTIME<x><y> 439 local major, minor = vars.LUA_RUNTIME:match('VCR%u*(%d+)(%d)$') -- MSVCR<x><y> or VCRUNTIME<x><y>
431 if not major then return "" end 440 if not major then return "" end
432 441 local key = ("HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\%d.%d\\Setup\\VC"):format(major, minor)
433 return get_registry(visual_studio_registry_key(major, minor), 'ProductDir') 442 return get_registry(key, 'ProductDir')
434end 443end
435 444
445-- requires vars.LUA_RUNTIME to be set before calling this function.
446local function get_windows_sdk_directory()
447 -- Only v7.1 and v6.1 shipped with compilers
448 -- Other versions requires a separate installation of Visual Studio.
449 -- see https://github.com/keplerproject/luarocks/pull/443#issuecomment-152792516
450 local wsdks = {
451 ["MSVCR100"] = "v7.1", -- shipped with Visual Studio 2010 compilers.
452 ["MSVCR90"] = "v6.1", -- shipped with Visual Studio 2008 compilers.
453 }
454 local wsdkver = wsdks[vars.LUA_RUNTIME]
455 if not wsdkver then
456 return nil
457 end
458
459 local key = "HKLM\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\"..wsdkver
460 return get_registry(key, 'InstallationFolder')
461end
436-- returns the batch command to setup msvc compiler path. 462-- returns the batch command to setup msvc compiler path.
437-- requires vars.LUA_RUNTIME and vars.UNAME_M to be set before calling this function. 463-- requires vars.LUA_RUNTIME and vars.UNAME_M to be set before calling this function.
438local function get_msvc_env_setup_cmd() 464local function get_msvc_env_setup_cmd()
439 local product_dir = get_visual_studio_directory()
440 local x64 = vars.UNAME_M=="x86_64" 465 local x64 = vars.UNAME_M=="x86_64"
441 466
442 -- 1. try vcvarsall.bat 467 -- 1. try visual studio command line tools
443 local vcvarsall = product_dir .. 'vcvarsall.bat' 468 local vcdir = get_visual_studio_directory()
444 if exists(vcvarsall) then 469 if vcdir then
445 return ('call "%s"%s'):format(vcvarsall, x64 and ' amd64' or '') 470 -- 1.1. try vcvarsall.bat
446 end 471 local vcvarsall = vcdir .. 'vcvarsall.bat'
472 if exists(vcvarsall) then
473 return ('call "%s"%s'):format(vcvarsall, x64 and ' amd64' or '')
474 end
447 475
448 -- 2. try vcvars32.bat / vcvars64.bat 476 -- 1.2. try vcvars32.bat / vcvars64.bat
449 local relative_path = x64 and "bin\\amd64\\vcvars64.bat" or "bin\\vcvars32.bat" 477 local relative_path = x64 and "bin\\amd64\\vcvars64.bat" or "bin\\vcvars32.bat"
450 local full_path = product_dir .. relative_path 478 local full_path = vcdir .. relative_path
451 if exists(full_path) then 479 if exists(full_path) then
452 return ('call "%s"'):format(full_path) 480 return ('call "%s"'):format(full_path)
481 end
453 end 482 end
454 483
455 -- 3. TODO: add support for Windows SDKs here. 484 -- 2. try for Windows SDKs command line tools.
485 local wsdkdir = get_windows_sdk_directory()
486 if wsdkdir then
487 local setenv = wsdkdir.."Bin\\SetEnv.cmd"
488 if exists(setenv) then
489 return ("call \"%s\" /Release /%s"):format(setenv, x64 and "x64" or "x86")
490 end
491 end
456 492
457 -- finaly, we can't detect more, just don't setup the msvc compiler in luarocks.bat. 493 -- finaly, we can't detect more, just don't setup the msvc compiler in luarocks.bat.
458 return "" 494 return ""