From b0160d0ece6ae5e09850b427f9c29d42c57d81d3 Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Sat, 26 Apr 2025 20:53:09 +0200 Subject: [PATCH] Adds 64bits support. --- build/premake/extern_libs5.lua | 30 +++++++++++++++--- build/premake/premake5.lua | 43 +++++++++++++++++++++----- source/lib/external_libraries/vorbis.h | 9 ++++++ source/lib/sysdep/os.h | 5 +-- source/lib/sysdep/os/win/wseh.cpp | 4 +++ 5 files changed, 76 insertions(+), 15 deletions(-) diff --git a/build/premake/extern_libs5.lua b/build/premake/extern_libs5.lua index 987fdfdbb0..069b7a45f4 100644 --- a/build/premake/extern_libs5.lua +++ b/build/premake/extern_libs5.lua @@ -9,13 +9,21 @@ if os.istarget("macosx") then libraries_dir = rootdir.."/libraries/macos/" elseif os.istarget("windows") then - libraries_dir = rootdir.."/libraries/win32/" + if arch == "amd64" then + libraries_dir = rootdir.."/libraries/win64/" + else + libraries_dir = rootdir.."/libraries/win32/" + end else -- No Unix-specific libs yet (use source directory instead!) end -- directory for shared, bundled libraries if os.istarget("windows") then - libraries_source_dir = rootdir.."/libraries/win32/" + if arch == "amd64" then + libraries_source_dir = rootdir.."/libraries/win64/" + else + libraries_source_dir = rootdir.."/libraries/win32/" + end else libraries_source_dir = rootdir.."/libraries/source/" end @@ -134,6 +142,10 @@ local function add_default_links(def) names = def.unix_names end + local arch_suffix = "" + if os.istarget("windows") and arch == "amd64" then + arch_suffix = "64" + end local suffix = "d" -- library is overriding default suffix (typically "" to indicate there is none) if def["dbg_suffix"] then @@ -146,6 +158,8 @@ local function add_default_links(def) suffix = "" end + suffix = arch_suffix .. suffix + for i,name in pairs(names) do filter "Debug" links { name .. suffix } @@ -712,9 +726,15 @@ extern_lib_defs = { link_settings = function() if os.istarget("windows") then add_default_lib_paths("vorbis") - add_default_links({ - win_names = { "libvorbisfile" }, - }) + if arch == "amd64" then + add_default_links({ + win_names = { "vorbisfile" }, + }) + else + add_default_links({ + win_names = { "libvorbisfile" }, + }) + end else pkgconfig.add_links("vorbisfile") end diff --git a/build/premake/premake5.lua b/build/premake/premake5.lua index adc6aaa632..602fb56f3e 100644 --- a/build/premake/premake5.lua +++ b/build/premake/premake5.lua @@ -44,8 +44,6 @@ end -- Root directory of project checkout relative to this .lua file rootdir = "../.." -dofile("extern_libs5.lua") - -- detect compiler for non-Windows if os.istarget("macosx") then cc = "clang" @@ -117,6 +115,9 @@ else end end +-- External libraries should know about arch. +dofile("extern_libs5.lua") + -- Test whether we need to link libexecinfo. -- This is mostly the case on musl systems, as well as on BSD systems : only glibc provides the -- backtrace symbols we require in the libc, for other libcs we use the libexecinfo library. @@ -538,7 +539,11 @@ function project_add_manifest() -- To use XP-style themed controls, we need to use the manifest to specify the -- desired version. (This must be set in the game's .exe in order to affect Atlas.) -- We can remove it once we remove wxWidgets - linkoptions { "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df'\"" } + if arch == "amd64" then + linkoptions { "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'\"" } + else + linkoptions { "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df'\"" } + end end -------------------------------------------------------------------------------- @@ -577,7 +582,11 @@ function setup_static_lib_project (project_name, rel_source_dirs, extern_libs, e -- The exception to this principle is Atlas UI, which is not a static library. rtti "off" - if os.istarget("macosx") then + if os.istarget("windows") then + if arch == "amd64" then + architecture("x86_64") + end + elseif os.istarget("macosx") then architecture(macos_arch) buildoptions { "-arch " .. macos_arch } linkoptions { "-arch " .. macos_arch } @@ -607,6 +616,9 @@ function setup_shared_lib_project (project_name, rel_source_dirs, extern_libs, e if os.istarget("windows") then links { "delayimp" } + if arch == "amd64" then + architecture("x86_64") + end elseif os.istarget("macosx") then architecture(macos_arch) buildoptions { "-arch " .. macos_arch } @@ -1083,7 +1095,11 @@ function setup_main_exe () end -- see manifest.cpp - project_add_manifest() + project_add_manifest(arch) + + if arch == "amd64" then + architecture("x86_64") + end elseif os.istarget("linux") or os.istarget("bsd") then @@ -1161,6 +1177,9 @@ function setup_atlas_project(project_name, target_type, rel_source_dirs, rel_inc if os.istarget("windows") then -- Link to required libraries links { "winmm", "delayimp" } + if arch == "amd64" then + architecture("x86_64") + end elseif os.istarget("macosx") then architecture(macos_arch) @@ -1285,7 +1304,10 @@ function setup_atlas_frontend_project (project_name) -- Platform Specifics if os.istarget("windows") then -- see manifest.cpp - project_add_manifest() + project_add_manifest(arch) + if arch == "amd64" then + architecture("x86_64") + end else -- Non-Windows, = Unix links { "AtlasObject" } @@ -1321,6 +1343,9 @@ function setup_collada_project(project_name, target_type, rel_source_dirs, rel_i -- Platform Specifics if os.istarget("windows") then characterset "MBCS" + if arch == "amd64" then + architecture("x86_64") + end elseif os.istarget("linux") then defines { "LINUX" } @@ -1374,7 +1399,6 @@ function setup_collada_projects() },{ -- include },{ -- extern_libs "fcollada", - "iconv", "libxml2" },{ -- extra_params }) @@ -1482,7 +1506,10 @@ function setup_tests() links { "delayimp" } - project_add_manifest() + project_add_manifest(arch) + if arch == "amd64" then + architecture("x86_64") + end elseif os.istarget("linux") or os.istarget("bsd") then diff --git a/source/lib/external_libraries/vorbis.h b/source/lib/external_libraries/vorbis.h index a0a41d7338..4cb1a31d23 100644 --- a/source/lib/external_libraries/vorbis.h +++ b/source/lib/external_libraries/vorbis.h @@ -29,12 +29,21 @@ #include +// TODO: remove hardcoded libraries. #if MSC_VERSION +#if _WIN64 +# ifdef NDEBUG +# pragma comment(lib, "vorbisfile.lib") +# else +# pragma comment(lib, "vorbisfiled.lib") +# endif +#else # ifdef NDEBUG # pragma comment(lib, "libvorbisfile.lib") # else # pragma comment(lib, "libvorbisfiled.lib") # endif #endif +#endif #endif // #ifndef INCLUDED_VORBIS diff --git a/source/lib/sysdep/os.h b/source/lib/sysdep/os.h index a958b83e2d..7b09464de9 100644 --- a/source/lib/sysdep/os.h +++ b/source/lib/sysdep/os.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2012 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -38,15 +38,16 @@ // Windows #if defined(_WIN64) +# define OS_WIN 1 # define OS_WIN64 1 #else # define OS_WIN64 0 -#endif #if defined(_WIN32) # define OS_WIN 1 #else # define OS_WIN 0 #endif +#endif // Linux #if defined(linux) || defined(__linux) || defined(__linux__) # define OS_LINUX 1 diff --git a/source/lib/sysdep/os/win/wseh.cpp b/source/lib/sysdep/os/win/wseh.cpp index 4072a4861f..64467a281e 100644 --- a/source/lib/sysdep/os/win/wseh.cpp +++ b/source/lib/sysdep/os/win/wseh.cpp @@ -162,7 +162,11 @@ static const wchar_t* GetSehExceptionDescription(const EXCEPTION_RECORD* er, // special case: display type and address. const wchar_t* accessType = (ei[0])? L"writing" : L"reading"; const ULONG_PTR address = ei[1]; +#if defined(_WIN64) + swprintf_s(description, maxChars, L"Access violation %ls 0x%08llX", accessType, address); +#else swprintf_s(description, maxChars, L"Access violation %ls 0x%08X", accessType, address); +#endif return description; } case EXCEPTION_DATATYPE_MISALIGNMENT: return L"Datatype misalignment";