diff --git a/premake5.lua b/premake5.lua
index 836e6d94b..052cce492 100644
--- a/premake5.lua
+++ b/premake5.lua
@@ -7,7 +7,7 @@ objdir(build_obj)
-- Define an ARCH variable
-- Only use this to enable architecture-specific functionality.
-if os.is("linux") then
+if os.istarget("linux") then
ARCH = os.outputof("uname -p")
else
ARCH = "unknown"
@@ -221,9 +221,9 @@ solution("xenia")
uuid("931ef4b0-6170-4f7a-aaf2-0fece7632747")
startproject("xenia-app")
architecture("x86_64")
- if os.is("linux") then
+ if os.istarget("linux") then
platforms({"Linux"})
- elseif os.is("windows") then
+ elseif os.istarget("windows") then
platforms({"Windows"})
-- Minimum version to support ID3D12GraphicsCommandList1 (for
-- SetSamplePositions).
@@ -266,7 +266,7 @@ solution("xenia")
include("src/xenia/ui/vulkan")
include("src/xenia/vfs")
- if os.is("windows") then
+ if os.istarget("windows") then
include("src/xenia/apu/xaudio2")
include("src/xenia/gpu/d3d12")
include("src/xenia/hid/winkey")
diff --git a/src/xenia/app/premake5.lua b/src/xenia/app/premake5.lua
index 0c371d6bf..40db69f08 100644
--- a/src/xenia/app/premake5.lua
+++ b/src/xenia/app/premake5.lua
@@ -40,9 +40,6 @@ project("xenia-app")
"xenia-vfs",
"xxhash",
})
- flags({
- "WinMain", -- Use WinMain instead of main.
- })
defines({
"XBYAK_NO_OP_NAMES",
"XBYAK_ENABLE_OMITTED_OPERAND",
diff --git a/src/xenia/cpu/backend/x64/x64_backend.cc b/src/xenia/cpu/backend/x64/x64_backend.cc
index 4e6356959..28a530759 100644
--- a/src/xenia/cpu/backend/x64/x64_backend.cc
+++ b/src/xenia/cpu/backend/x64/x64_backend.cc
@@ -497,22 +497,22 @@ void X64ThunkEmitter::EmitSaveVolatileRegs() {
mov(qword[rsp + offsetof(StackLayout::Thunk, r[5])], r10);
mov(qword[rsp + offsetof(StackLayout::Thunk, r[6])], r11);
- // movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm0);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm1);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm2);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm3);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm4);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm5);
+ // vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm0);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm1);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm2);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm3);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm4);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm5);
}
void X64ThunkEmitter::EmitLoadVolatileRegs() {
// Load volatile registers from our stack frame.
- // movaps(xmm0, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);
- movaps(xmm1, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);
- movaps(xmm2, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);
- movaps(xmm3, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);
- movaps(xmm4, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);
- movaps(xmm5, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);
+ // vmovaps(xmm0, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);
+ vmovaps(xmm1, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);
+ vmovaps(xmm2, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);
+ vmovaps(xmm3, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);
+ vmovaps(xmm4, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);
+ vmovaps(xmm5, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);
// mov(rax, qword[rsp + offsetof(StackLayout::Thunk, r[0])]);
mov(rcx, qword[rsp + offsetof(StackLayout::Thunk, r[1])]);
@@ -535,29 +535,29 @@ void X64ThunkEmitter::EmitSaveNonvolatileRegs() {
mov(qword[rsp + offsetof(StackLayout::Thunk, r[7])], r14);
mov(qword[rsp + offsetof(StackLayout::Thunk, r[8])], r15);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm6);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm7);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm8);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm9);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm10);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm11);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[6])], xmm12);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[7])], xmm13);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[8])], xmm14);
- movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[9])], xmm15);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm6);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm7);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm8);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm9);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm10);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm11);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[6])], xmm12);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[7])], xmm13);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[8])], xmm14);
+ vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[9])], xmm15);
}
void X64ThunkEmitter::EmitLoadNonvolatileRegs() {
- movaps(xmm6, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);
- movaps(xmm7, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);
- movaps(xmm8, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);
- movaps(xmm9, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);
- movaps(xmm10, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);
- movaps(xmm11, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);
- movaps(xmm12, qword[rsp + offsetof(StackLayout::Thunk, xmm[6])]);
- movaps(xmm13, qword[rsp + offsetof(StackLayout::Thunk, xmm[7])]);
- movaps(xmm14, qword[rsp + offsetof(StackLayout::Thunk, xmm[8])]);
- movaps(xmm15, qword[rsp + offsetof(StackLayout::Thunk, xmm[9])]);
+ vmovaps(xmm6, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);
+ vmovaps(xmm7, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);
+ vmovaps(xmm8, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);
+ vmovaps(xmm9, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);
+ vmovaps(xmm10, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);
+ vmovaps(xmm11, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);
+ vmovaps(xmm12, qword[rsp + offsetof(StackLayout::Thunk, xmm[6])]);
+ vmovaps(xmm13, qword[rsp + offsetof(StackLayout::Thunk, xmm[7])]);
+ vmovaps(xmm14, qword[rsp + offsetof(StackLayout::Thunk, xmm[8])]);
+ vmovaps(xmm15, qword[rsp + offsetof(StackLayout::Thunk, xmm[9])]);
mov(rbx, qword[rsp + offsetof(StackLayout::Thunk, r[0])]);
mov(rcx, qword[rsp + offsetof(StackLayout::Thunk, r[1])]);
diff --git a/src/xenia/gpu/vulkan/premake5.lua b/src/xenia/gpu/vulkan/premake5.lua
index f8e9903fe..6a7b9200b 100644
--- a/src/xenia/gpu/vulkan/premake5.lua
+++ b/src/xenia/gpu/vulkan/premake5.lua
@@ -59,9 +59,6 @@ project("xenia-gpu-vulkan-trace-viewer")
"xenia-vfs",
"xxhash",
})
- flags({
- "WinMain", -- Use WinMain instead of main.
- })
defines({
})
includedirs({
diff --git a/src/xenia/hid/premake5.lua b/src/xenia/hid/premake5.lua
index 1b374a4fb..ea7b6afbf 100644
--- a/src/xenia/hid/premake5.lua
+++ b/src/xenia/hid/premake5.lua
@@ -33,9 +33,6 @@ project("xenia-hid-demo")
"xenia-ui",
"xenia-ui-vulkan",
})
- flags({
- "WinMain", -- Use WinMain instead of main.
- })
defines({
"GLEW_STATIC=1",
"GLEW_MX=1",
diff --git a/src/xenia/ui/vulkan/premake5.lua b/src/xenia/ui/vulkan/premake5.lua
index e9abb1c5c..8246ef249 100644
--- a/src/xenia/ui/vulkan/premake5.lua
+++ b/src/xenia/ui/vulkan/premake5.lua
@@ -37,9 +37,6 @@ project("xenia-ui-window-vulkan-demo")
"xenia-ui-spirv",
"xenia-ui-vulkan",
})
- flags({
- "WinMain", -- Use WinMain instead of main.
- })
defines({
})
includedirs({
diff --git a/src/xenia/vfs/premake5.lua b/src/xenia/vfs/premake5.lua
index be71cef59..ea174e3e0 100644
--- a/src/xenia/vfs/premake5.lua
+++ b/src/xenia/vfs/premake5.lua
@@ -26,9 +26,6 @@ project("xenia-vfs-dump")
"xenia-base",
"xenia-vfs",
})
- flags({
- -- "WinMain", -- Use WinMain instead of main.
- })
defines({})
includedirs({
project_root.."/third_party/gflags/src",
diff --git a/third_party/premake-core b/third_party/premake-core
index 61d799c8f..8593bc948 160000
--- a/third_party/premake-core
+++ b/third_party/premake-core
@@ -1 +1 @@
-Subproject commit 61d799c8f9d1ab8130942b2d9dcd2819b9d8b049
+Subproject commit 8593bc9480924f0d0724a4533e8de70222e6a08d
diff --git a/third_party/vswhere/vswhere.exe b/third_party/vswhere/vswhere.exe
index 80706d852..096d016fb 100644
Binary files a/third_party/vswhere/vswhere.exe and b/third_party/vswhere/vswhere.exe differ
diff --git a/tools/build/bin/premake5.exe b/tools/build/bin/premake5.exe
index bcf844443..ed8857680 100644
Binary files a/tools/build/bin/premake5.exe and b/tools/build/bin/premake5.exe differ
diff --git a/tools/build/premake b/tools/build/premake
index aa6ae27ad..c4c471d99 100644
--- a/tools/build/premake
+++ b/tools/build/premake
@@ -69,9 +69,8 @@ def build_premake():
elif sys.platform == 'win32':
# Grab Visual Studio version and execute shell to set up environment.
vs_version = import_vs_environment()
- if vs_version != 2015:
- print('ERROR: Visual Studio 2015 not found!')
- print('Ensure you have the VS140COMNTOOLS environment variable!')
+ if vs_version is None:
+ print('ERROR: Visual Studio not found!')
sys.exit(1)
return
@@ -143,17 +142,30 @@ def import_vs_environment():
A version such as 2015 or None if no VS is found.
"""
version = 0
+
+ candidate_path = subprocess.check_output('../../third_party/vswhere/vswhere.exe -all -version "[15,)" -latest -format value -property installationPath', shell=False, universal_newlines=True)
+ candidate_path = candidate_path.strip()
+
tools_path = ''
- if 'VS140COMNTOOLS' in os.environ:
+ if candidate_path:
+ tools_path = os.path.join(candidate_path, 'vc\\auxiliary\\build\\vcvarsall.bat')
+ if os.path.isfile(tools_path) and os.access(tools_path, os.X_OK):
+ version = subprocess.check_output('../../third_party/vswhere/vswhere.exe -version "[15,)" -latest -format value -property catalog_productLineVersion', shell=False, universal_newlines=True)
+ version = version.strip()
+ if version:
+ version = int(version)
+ else:
+ version = 2017
+ if version == 0 and 'VS140COMNTOOLS' in os.environ:
version = 2015
tools_path = os.environ['VS140COMNTOOLS']
+ tools_path = os.path.join(tools_path, '..\\..\\vc\\vcvarsall.bat')
if version == 0:
return None
- tools_path = os.path.join(tools_path, '..\\..\\vc\\vcvarsall.bat')
- args = [tools_path, '&&', 'set']
+ args = [tools_path, 'x64', '&&', 'set']
popen = subprocess.Popen(
- args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
variables, _ = popen.communicate()
envvars_to_save = (
'devenvdir',
diff --git a/tools/build/premake5.lua b/tools/build/premake5.lua
index 49575613f..6a66f5a2b 100644
--- a/tools/build/premake5.lua
+++ b/tools/build/premake5.lua
@@ -1,3 +1,5 @@
+require("vstudio")
+
include("scripts/build_paths.lua")
include("scripts/force_compile_as_c.lua")
include("scripts/force_compile_as_cc.lua")
diff --git a/tools/build/scripts/build_paths.lua b/tools/build/scripts/build_paths.lua
index 5fcceb061..e97bac0f4 100644
--- a/tools/build/scripts/build_paths.lua
+++ b/tools/build/scripts/build_paths.lua
@@ -7,7 +7,7 @@ build_tools = "tools/build"
build_scripts = build_tools .. "/scripts"
build_tools_src = build_tools .. "/src"
-if os.is("windows") then
+if os.istarget("windows") then
platform_suffix = "win"
else
platform_suffix = "posix"
diff --git a/tools/build/scripts/force_compile_as_c.lua b/tools/build/scripts/force_compile_as_c.lua
index e26c3b7ec..30de988e9 100644
--- a/tools/build/scripts/force_compile_as_c.lua
+++ b/tools/build/scripts/force_compile_as_c.lua
@@ -21,7 +21,11 @@ if premake.override then
-- for msvc
premake.override(premake.vstudio.vc2010, "additionalCompileOptions", function(base, cfg, condition)
if cfg.abspath and table.contains(forced_c_files, cfg.abspath) then
- _p(3,'CompileAsC', condition)
+ if condition == nil or condition == '' then
+ _p(3,'CompileAsC')
+ else
+ _p(3,'CompileAsC', condition)
+ end
end
return base(cfg, condition)
end)
diff --git a/tools/build/scripts/force_compile_as_cc.lua b/tools/build/scripts/force_compile_as_cc.lua
index 16c680476..c7a15cef0 100644
--- a/tools/build/scripts/force_compile_as_cc.lua
+++ b/tools/build/scripts/force_compile_as_cc.lua
@@ -21,7 +21,11 @@ if premake.override then
-- for msvc
premake.override(premake.vstudio.vc2010, "additionalCompileOptions", function(base, cfg, condition)
if cfg.abspath and table.contains(forced_cc_files, cfg.abspath) then
- _p(3,'CompileAsCpp', condition)
+ if condition == nil or condition == '' then
+ _p(3,'CompileAsCpp')
+ else
+ _p(3,'CompileAsCpp', condition)
+ end
end
return base(cfg, condition)
end)
diff --git a/xenia-build b/xenia-build
index b6cf45401..0e7c27d2b 100755
--- a/xenia-build
+++ b/xenia-build
@@ -100,7 +100,12 @@ def import_vs_environment():
if candidate_path:
tools_path = os.path.join(candidate_path, 'vc\\auxiliary\\build\\vcvarsall.bat')
if os.path.isfile(tools_path) and os.access(tools_path, os.X_OK):
- version = 2017
+ version = subprocess.check_output('third_party/vswhere/vswhere.exe -version "[15,)" -latest -format value -property catalog_productLineVersion', shell=False, universal_newlines=True)
+ version = version.strip()
+ if version:
+ version = int(version)
+ else:
+ version = 2017
if version == 0 and 'VS140COMNTOOLS' in os.environ:
version = 2015
tools_path = os.environ['VS140COMNTOOLS']
@@ -317,16 +322,19 @@ def run_premake(target_os, action, cc=None):
target_os: target --os to pass to premake.
action: action to preform.
"""
- ret = subprocess.call([
+ args = [
sys.executable,
os.path.join('tools', 'build', 'premake'),
'--file=premake5.lua',
'--os=%s' % target_os,
- '--cc=%s' % ('clang' if not cc else cc),
'--test-suite-mode=combined',
'--verbose',
action,
- ], shell=False)
+ ]
+ if cc:
+ args.insert(4, '--cc=%s' % cc)
+
+ ret = subprocess.call(args, shell=False)
if ret == 0:
generate_version_h()