diff --git a/src/xenia/app/premake5.lua b/src/xenia/app/premake5.lua index 442d6585b..d20fe565a 100644 --- a/src/xenia/app/premake5.lua +++ b/src/xenia/app/premake5.lua @@ -50,18 +50,20 @@ project("xenia-app") files({ "xenia_main.cc", "../base/main_"..platform_suffix..".cc", + "../base/main_entrypoint_"..platform_suffix..".cc", }) - filter("files:xenia_main.cc or ../base/main_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX for main_win.cc so our AVX check/error can happen. + resincludedirs({ + project_root, + }) filter("platforms:Windows") files({ "main_resources.rc", }) - resincludedirs({ - project_root, - }) + + filter("files:../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. filter("platforms:Linux") links({ diff --git a/src/xenia/base/main_entrypoint_posix.cc b/src/xenia/base/main_entrypoint_posix.cc new file mode 100644 index 000000000..b93b31502 --- /dev/null +++ b/src/xenia/base/main_entrypoint_posix.cc @@ -0,0 +1,38 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2014 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/base/main.h" + +#include + +#include "xenia/base/logging.h" +#include "xenia/base/string.h" + +extern "C" int main(int argc, char** argv) { + auto entry_info = xe::GetEntryInfo(); + + google::SetUsageMessage(std::string("usage: ") + + xe::to_string(entry_info.usage)); + google::SetVersionString("1.0"); + google::ParseCommandLineFlags(&argc, &argv, true); + + std::vector args; + for (int n = 0; n < argc; n++) { + args.push_back(xe::to_wstring(argv[n])); + } + + // Initialize logging. Needs parsed FLAGS. + xe::InitializeLogging(entry_info.name); + + // Call app-provided entry point. + int result = entry_info.entry_point(args); + + google::ShutDownCommandLineFlags(); + return result; +} diff --git a/src/xenia/base/main_entrypoint_win.cc b/src/xenia/base/main_entrypoint_win.cc new file mode 100644 index 000000000..9ec762d74 --- /dev/null +++ b/src/xenia/base/main_entrypoint_win.cc @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2014 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/base/main.h" + +#include +#include +#include + +#include + +// Autogenerated by `xb premake`. +#include "build/version.h" + +#include "xenia/base/platform_win.h" +#include "xenia/base/string.h" + +#include "third_party/xbyak/xbyak/xbyak_util.h" + +namespace xe { +void AttachConsole(); +int Main(); +}; // namespace xe + +// Used in console mode apps; automatically picked based on subsystem. +int main(int, char**) { + Xbyak::util::Cpu cpu; + if (!cpu.has(Xbyak::util::Cpu::tAVX)) { + printf( + "Your CPU does not support AVX, which is required by Xenia.\r\nSee the " + "FAQ for system requirements at https://xenia.jp\r\n"); + return -1; + } + return xe::Main(); +} + +// Used in windowed apps; automatically picked based on subsystem. +int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) { + Xbyak::util::Cpu cpu; + if (!cpu.has(Xbyak::util::Cpu::tAVX)) { + MessageBoxA( + NULL, + "Your CPU does not support AVX, which is required by Xenia. See the " + "FAQ for system requirements at https://xenia.jp", + "Xenia Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND); + return -1; + } + + // Attach a console so we can write output to stdout. If the user hasn't + // redirected output themselves it'll pop up a window. + xe::AttachConsole(); + + // Run normal entry point. + return xe::Main(); +} + +#if defined _M_IX86 +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#elif defined _M_IA64 +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#elif defined _M_X64 +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#else +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#endif diff --git a/src/xenia/base/main_posix.cc b/src/xenia/base/main_posix.cc index 55dfae745..0a7d75521 100644 --- a/src/xenia/base/main_posix.cc +++ b/src/xenia/base/main_posix.cc @@ -19,26 +19,3 @@ namespace xe { bool has_console_attached() { return true; } } // namespace xe - -extern "C" int main(int argc, char** argv) { - auto entry_info = xe::GetEntryInfo(); - - google::SetUsageMessage(std::string("usage: ") + - xe::to_string(entry_info.usage)); - google::SetVersionString("1.0"); - google::ParseCommandLineFlags(&argc, &argv, true); - - std::vector args; - for (int n = 0; n < argc; n++) { - args.push_back(xe::to_wstring(argv[n])); - } - - // Initialize logging. Needs parsed FLAGS. - xe::InitializeLogging(entry_info.name); - - // Call app-provided entry point. - int result = entry_info.entry_point(args); - - google::ShutDownCommandLineFlags(); - return result; -} diff --git a/src/xenia/base/main_win.cc b/src/xenia/base/main_win.cc index e495b07d8..c0c818bcc 100644 --- a/src/xenia/base/main_win.cc +++ b/src/xenia/base/main_win.cc @@ -129,14 +129,6 @@ int Main() { // Initialize logging. Needs parsed FLAGS. xe::InitializeLogging(entry_info.name); - Xbyak::util::Cpu cpu; - if (!cpu.has(Xbyak::util::Cpu::tAVX)) { - xe::FatalError( - "Your CPU does not support AVX, which is required by Xenia. See the " - "FAQ for system requirements at https://xenia.jp"); - return -1; - } - // Print version info. XELOGI("Build: %s / %s on %s", XE_BUILD_BRANCH, XE_BUILD_COMMIT, XE_BUILD_DATE); @@ -156,34 +148,3 @@ int Main() { } } // namespace xe - -// Used in console mode apps; automatically picked based on subsystem. -int main(int argc_ignored, char** argv_ignored) { return xe::Main(); } - -// Used in windowed apps; automatically picked based on subsystem. -int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR command_line, int) { - // Attach a console so we can write output to stdout. If the user hasn't - // redirected output themselves it'll pop up a window. - xe::AttachConsole(); - - // Run normal entry point. - return xe::Main(); -} - -#if defined _M_IX86 -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#elif defined _M_IA64 -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#elif defined _M_X64 -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#else -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#endif diff --git a/src/xenia/cpu/ppc/testing/premake5.lua b/src/xenia/cpu/ppc/testing/premake5.lua index d2d5549cd..11dcbe961 100644 --- a/src/xenia/cpu/ppc/testing/premake5.lua +++ b/src/xenia/cpu/ppc/testing/premake5.lua @@ -18,6 +18,7 @@ project("xenia-cpu-ppc-tests") files({ "ppc_testing_main.cc", "../../../base/main_"..platform_suffix..".cc", + "../../../base/main_entrypoint_"..platform_suffix..".cc", }) files({ "*.s", @@ -25,8 +26,11 @@ project("xenia-cpu-ppc-tests") includedirs({ project_root.."/third_party/gflags/src", }) + filter("files:*.s") flags({"ExcludeFromBuild"}) + filter("files:../../../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. filter("platforms:Windows") debugdir(project_root) debugargs({ @@ -51,14 +55,12 @@ project("xenia-cpu-ppc-nativetests") files({ "ppc_testing_native_main.cc", "../../../base/main_"..platform_suffix..".cc", + "../../../base/main_entrypoint_"..platform_suffix..".cc", }) files({ "instr_*.s", "seq_*.s", }) - filter("files:instr_*.s", "files:seq_*.s") - flags({"ExcludeFromBuild"}) - filter({}) includedirs({ project_root.."/third_party/gflags/src", }) @@ -70,4 +72,9 @@ project("xenia-cpu-ppc-nativetests") "ppc_testing_native_thunks.s", }) + filter("files:instr_*.s", "files:seq_*.s") + flags({"ExcludeFromBuild"}) + filter("files:../../../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + end \ No newline at end of file diff --git a/src/xenia/gpu/premake5.lua b/src/xenia/gpu/premake5.lua index d0ce85820..fdc2c4e6f 100644 --- a/src/xenia/gpu/premake5.lua +++ b/src/xenia/gpu/premake5.lua @@ -46,8 +46,12 @@ project("xenia-gpu-shader-compiler") files({ "shader_compiler_main.cc", "../base/main_"..platform_suffix..".cc", + "../base/main_entrypoint_"..platform_suffix..".cc", }) + filter("files:../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + filter("platforms:Windows") -- Only create the .user file if it doesn't already exist. local user_file = project_root.."/build/xenia-gpu-shader-compiler.vcxproj.user" diff --git a/src/xenia/gpu/vulkan/premake5.lua b/src/xenia/gpu/vulkan/premake5.lua index 82b843b59..4d2b70990 100644 --- a/src/xenia/gpu/vulkan/premake5.lua +++ b/src/xenia/gpu/vulkan/premake5.lua @@ -68,8 +68,12 @@ project("xenia-gpu-vulkan-trace-viewer") files({ "vulkan_trace_viewer_main.cc", "../../base/main_"..platform_suffix..".cc", + "../../base/main_entrypoint_"..platform_suffix..".cc", }) + filter("files:../../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + filter("platforms:Linux") links({ "X11", @@ -139,8 +143,12 @@ project("xenia-gpu-vulkan-trace-dump") files({ "vulkan_trace_dump_main.cc", "../../base/main_"..platform_suffix..".cc", + "../../base/main_entrypoint_"..platform_suffix..".cc", }) + filter("files:../../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + filter("platforms:Linux") links({ "X11", diff --git a/src/xenia/hid/premake5.lua b/src/xenia/hid/premake5.lua index ea7b6afbf..67580189f 100644 --- a/src/xenia/hid/premake5.lua +++ b/src/xenia/hid/premake5.lua @@ -43,11 +43,15 @@ project("xenia-hid-demo") files({ "hid_demo.cc", "../base/main_"..platform_suffix..".cc", + "../base/main_entrypoint_"..platform_suffix..".cc", }) resincludedirs({ project_root, }) + filter("files:../base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + filter("platforms:Linux") links({ "X11", diff --git a/src/xenia/ui/vulkan/premake5.lua b/src/xenia/ui/vulkan/premake5.lua index 8246ef249..74ea9e6db 100644 --- a/src/xenia/ui/vulkan/premake5.lua +++ b/src/xenia/ui/vulkan/premake5.lua @@ -47,11 +47,15 @@ project("xenia-ui-window-vulkan-demo") "../window_demo.cc", "vulkan_window_demo.cc", project_root.."/src/xenia/base/main_"..platform_suffix..".cc", + project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc", }) resincludedirs({ project_root, }) + filter("files:"..project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + filter("platforms:Linux") links({ "X11", diff --git a/src/xenia/vfs/premake5.lua b/src/xenia/vfs/premake5.lua index ea174e3e0..cdb0a66f1 100644 --- a/src/xenia/vfs/premake5.lua +++ b/src/xenia/vfs/premake5.lua @@ -34,8 +34,11 @@ project("xenia-vfs-dump") files({ "vfs_dump.cc", project_root.."/src/xenia/base/main_"..platform_suffix..".cc", + project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc", }) resincludedirs({ project_root, }) + filter("files:"..project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen.