From 46cb798b6531938f2d9afe6fd6b83f76d555b6fa Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 00:02:24 +0400 Subject: [PATCH 01/25] fix: fix GLFW video mode fallback on startup --- src/skel/glfw/glfw.cpp | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 906318411..3bfecd758 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -834,16 +834,16 @@ psSelectDevice() if(FrontEndMenuManager.m_nPrefsWidth == 0 || FrontEndMenuManager.m_nPrefsHeight == 0 || FrontEndMenuManager.m_nPrefsDepth == 0){ - // Defaults if nothing specified const GLFWvidmode *mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); FrontEndMenuManager.m_nPrefsWidth = mode->width; FrontEndMenuManager.m_nPrefsHeight = mode->height; FrontEndMenuManager.m_nPrefsDepth = 32; - FrontEndMenuManager.m_nPrefsWindowed = 0; } // Find the videomode that best fits what we got from the settings file + bestWndMode = -1; RwInt32 bestFsMode = -1; + RwInt32 firstFsMode = -1; RwInt32 bestWidth = -1; RwInt32 bestHeight = -1; RwInt32 bestDepth = -1; @@ -853,6 +853,8 @@ psSelectDevice() if (!(vm.flags & rwVIDEOMODEEXCLUSIVE)){ bestWndMode = GcurSelVM; } else { + if(firstFsMode < 0) + firstFsMode = GcurSelVM; // try the largest one that isn't larger than what we wanted if(vm.width >= bestWidth && vm.width <= FrontEndMenuManager.m_nPrefsWidth && vm.height >= bestHeight && vm.height <= FrontEndMenuManager.m_nPrefsHeight && @@ -865,29 +867,42 @@ psSelectDevice() } } - if(bestFsMode < 0){ + RwInt32 selectedFsMode = bestFsMode >= 0 ? bestFsMode : firstFsMode; + GcurSelVM = selectedFsMode; + if(GcurSelVM < 0 && FrontEndMenuManager.m_nPrefsWindowed) + GcurSelVM = bestWndMode; + if(GcurSelVM < 0){ printf("WARNING: Cannot find desired video mode, selecting device cancelled\n"); return FALSE; } - GcurSelVM = bestFsMode; - FrontEndMenuManager.m_nDisplayVideoMode = GcurSelVM; - FrontEndMenuManager.m_nPrefsVideoMode = FrontEndMenuManager.m_nDisplayVideoMode; + if(selectedFsMode >= 0){ + FrontEndMenuManager.m_nDisplayVideoMode = selectedFsMode; + FrontEndMenuManager.m_nPrefsVideoMode = FrontEndMenuManager.m_nDisplayVideoMode; + } FrontEndMenuManager.m_nSelectedScreenMode = FrontEndMenuManager.m_nPrefsWindowed; } #endif +#ifdef IMPROVED_VIDEOMODE + if (FrontEndMenuManager.m_nPrefsWindowed && bestWndMode < 0){ + printf("WARNING: Cannot find windowed video mode, selecting device cancelled\n"); + return FALSE; + } +#endif + RwEngineGetVideoModeInfo(&vm, GcurSelVM); #ifdef IMPROVED_VIDEOMODE + if ((!FrontEndMenuManager.m_nPrefsWindowed || (vm.flags & rwVIDEOMODEEXCLUSIVE)) && + vm.width > 0 && vm.height > 0 && vm.depth > 0) { + FrontEndMenuManager.m_nPrefsWidth = vm.width; + FrontEndMenuManager.m_nPrefsHeight = vm.height; + FrontEndMenuManager.m_nPrefsDepth = vm.depth; + } if (FrontEndMenuManager.m_nPrefsWindowed) GcurSelVM = bestWndMode; - - // Now GcurSelVM is 0 but vm has sizes(and fullscreen flag) of the video mode we want, that's why we changed the rwVIDEOMODEEXCLUSIVE conditions below - FrontEndMenuManager.m_nPrefsWidth = vm.width; - FrontEndMenuManager.m_nPrefsHeight = vm.height; - FrontEndMenuManager.m_nPrefsDepth = vm.depth; #endif #ifndef PS2_MENU From 80d7b01945e625608e49227f30370b17ee7a3d6f Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 00:14:50 +0400 Subject: [PATCH 02/25] fix: fix GLFW mouse activation on startup --- src/skel/glfw/glfw.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 3bfecd758..0c0fefbcd 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -277,7 +277,9 @@ void psMouseSetPos(RwV2d *pos) { glfwSetCursorPos(PSGLOBAL(window), pos->x, pos->y); - + if (glfwGetWindowAttrib(PSGLOBAL(window), GLFW_FOCUSED)) + PSGLOBAL(cursorIsInWindow) = true; + PSGLOBAL(lastMousePos.x) = (RwInt32)pos->x; PSGLOBAL(lastMousePos.y) = (RwInt32)pos->y; @@ -1046,6 +1048,8 @@ long _InputInitialiseMouse(bool exclusive) // Disabled = keep cursor centered and hide lastCursorMode = exclusive ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_HIDDEN; glfwSetInputMode(PSGLOBAL(window), GLFW_CURSOR, lastCursorMode); + if (exclusive && glfwGetWindowAttrib(PSGLOBAL(window), GLFW_FOCUSED)) + PSGLOBAL(cursorIsInWindow) = true; return 0; } @@ -1872,6 +1876,10 @@ cursorEnterCB(GLFWwindow* window, int entered) { void windowFocusCB(GLFWwindow* window, int focused) { WindowFocused = !!focused; + if (!focused) + PSGLOBAL(cursorIsInWindow) = false; + else if (lastCursorMode == GLFW_CURSOR_DISABLED || glfwGetWindowAttrib(window, GLFW_HOVERED)) + PSGLOBAL(cursorIsInWindow) = true; } void From 743d716148b72adfa250b934184235f4885f7520 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 13:46:02 +0400 Subject: [PATCH 03/25] feat: locate macOS game directory when launched from Finder --- src/core/FileMgr.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++-- src/core/FileMgr.h | 6 ++-- src/core/main.cpp | 2 +- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index 124423529..f197bd103 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -3,6 +3,9 @@ #ifdef _WIN32 #include #endif +#ifdef __APPLE__ +#include +#endif #include "common.h" #include "crossplatform.h" @@ -61,6 +64,68 @@ void mychdir(char const *path) #define mychdir chdir #endif +#ifdef __APPLE__ +static bool +GameFileExists(const char *root, const char *name) +{ + char path[FILEMGR_PATH_SIZE]; + int length = snprintf(path, sizeof(path), "%s%s%s", root, + root[0] != '\0' && root[strlen(root) - 1] == '/' ? "" : "/", name); + if(length < 0 || length >= (int)sizeof(path)) + return false; + + FILE *file = fcaseopen(path, "rb"); + if(file == nil) + return false; + fclose(file); + return true; +} + +static bool +SetGameRoot(const char *root, char *path, size_t pathSize) +{ + char realRoot[FILEMGR_PATH_SIZE]; + if(realpath(root, realRoot) == nil || + !GameFileExists(realRoot, "data/gta_vc.dat") || + !GameFileExists(realRoot, "models/gta3.img")) + return false; + + int length = snprintf(path, pathSize, "%s/", realRoot); + return length >= 0 && length < (int)pathSize; +} + +static bool +GetExecutableDir(char *path, size_t pathSize) +{ + char executable[FILEMGR_PATH_SIZE]; + uint32 size = sizeof(executable); + if(_NSGetExecutablePath(executable, &size) != 0) + return false; + + char *slash = strrchr(executable, '/'); + if(slash == nil) + return false; + *slash = '\0'; + + char realPath[FILEMGR_PATH_SIZE]; + const char *dir = realpath(executable, realPath) == nil ? executable : realPath; + int length = snprintf(path, pathSize, "%s", dir); + return length >= 0 && length < (int)pathSize; +} + +static bool +FindGameRoot(char *path, size_t pathSize) +{ + char cwd[FILEMGR_PATH_SIZE]; + if(_getcwd(cwd, sizeof(cwd)) != nil && SetGameRoot(cwd, path, pathSize)) + return true; + + char executableDir[FILEMGR_PATH_SIZE]; + return GetExecutableDir(executableDir, sizeof(executableDir)) && + SetGameRoot(executableDir, path, pathSize); +} +#endif + /* Force file to open as binary but remember if it was text mode */ static int myfopen(const char *filename, const char *mode) @@ -206,8 +271,8 @@ myfeof(int fd) } -char CFileMgr::ms_rootDirName[128] = {'\0'}; -char CFileMgr::ms_dirName[128]; +char CFileMgr::ms_rootDirName[FILEMGR_PATH_SIZE] = {'\0'}; +char CFileMgr::ms_dirName[FILEMGR_PATH_SIZE]; void CFileMgr::Initialise(void) @@ -218,8 +283,16 @@ CFileMgr::Initialise(void) strcat(ms_rootDirName, "/"); debug("Android: Root Dir: %s\n", ms_rootDirName); } +#elif defined(__APPLE__) + if(FindGameRoot(ms_rootDirName, sizeof(ms_rootDirName))){ + strcpy(ms_dirName, ms_rootDirName); + mychdir(ms_rootDirName); + }else{ + _getcwd(ms_rootDirName, sizeof(ms_rootDirName)); + strcat(ms_rootDirName, "\\"); + } #else - _getcwd(ms_rootDirName, 128); + _getcwd(ms_rootDirName, sizeof(ms_rootDirName)); strcat(ms_rootDirName, "\\"); #endif } diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h index a3a392850..420d5ad23 100644 --- a/src/core/FileMgr.h +++ b/src/core/FileMgr.h @@ -1,10 +1,12 @@ #ifndef __GTA_FILEMGR_H__ #define __GTA_FILEMGR_H__ +#define FILEMGR_PATH_SIZE 1024 + class CFileMgr { - static char ms_rootDirName[128]; - static char ms_dirName[128]; + static char ms_rootDirName[FILEMGR_PATH_SIZE]; + static char ms_dirName[FILEMGR_PATH_SIZE]; public: static void Initialise(void); static void ChangeDir(const char *dir); diff --git a/src/core/main.cpp b/src/core/main.cpp index 7cfb29cf5..a412a9864 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -332,7 +332,7 @@ DoFade(void) bool RwGrabScreen(RwCamera *camera, RwChar *filename) { - char temp[255]; + char temp[FILEMGR_PATH_SIZE + 255]; RwImage *pImage = RsGrabScreen(camera); bool result = true; From 40198d9c1ca9ee7d133b0129699d6fa7878964c8 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 14:17:15 +0400 Subject: [PATCH 04/25] feat: ask the user to choose a game directory if gamefiles could not be found --- src/core/FileMgr.cpp | 104 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 94 insertions(+), 10 deletions(-) diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index f197bd103..cc74424c0 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -5,6 +5,7 @@ #endif #ifdef __APPLE__ #include +#include #endif #include "common.h" #include "crossplatform.h" @@ -113,16 +114,102 @@ GetExecutableDir(char *path, size_t pathSize) return length >= 0 && length < (int)pathSize; } +static bool +GetGameRootFile(char *dir, size_t dirSize, char *path, size_t pathSize) +{ + const char *home = getenv("HOME"); + if(home == nil || *home == '\0') + return false; + + int len = snprintf(dir, dirSize, "%s/Library/Application Support/reVC", home); + if(len < 0 || len >= (int)dirSize) + return false; + len = snprintf(path, pathSize, "%s/gamefiles", dir); + return len >= 0 && len < (int)pathSize; +} + +static bool +ReadGameRoot(char *path, size_t pathSize) +{ + char dir[FILEMGR_PATH_SIZE]; + char fileName[FILEMGR_PATH_SIZE]; + if(!GetGameRootFile(dir, sizeof(dir), fileName, sizeof(fileName))) + return false; + + FILE *file = fopen(fileName, "r"); + if(file == nil) + return false; + + char root[FILEMGR_PATH_SIZE]; + bool found = fgets(root, sizeof(root), file) != nil; + fclose(file); + if(!found) + return false; + + root[strcspn(root, "\r\n")] = '\0'; + return SetGameRoot(root, path, pathSize); +} + +static void +WriteGameRoot(const char *root) +{ + char dir[FILEMGR_PATH_SIZE]; + char fileName[FILEMGR_PATH_SIZE]; + if(!GetGameRootFile(dir, sizeof(dir), fileName, sizeof(fileName))) + return; + + mkdir(dir, 0755); + FILE *file = fopen(fileName, "w"); + if(file != nil){ + fprintf(file, "%s\n", root); + fclose(file); + } +} + +static bool +ChooseGameRoot(char *path, size_t pathSize) +{ + bool retry = false; + for(;;){ + const char *prompt = retry ? + "That folder is not a GTA Vice City installation. Choose the folder containing the data and models folders." : + "Choose the GTA Vice City installation folder."; + char command[512]; + snprintf(command, sizeof(command), + "/usr/bin/osascript -e 'POSIX path of (choose folder with prompt \"%s\")' 2>/dev/null", prompt); + + FILE *pipe = popen(command, "r"); + if(pipe == nil) + return false; + + char root[FILEMGR_PATH_SIZE]; + bool found = fgets(root, sizeof(root), pipe) != nil; + int status = pclose(pipe); + if(!found || status != 0) + return false; + + root[strcspn(root, "\r\n")] = '\0'; + if(SetGameRoot(root, path, pathSize)){ + WriteGameRoot(path); + return true; + } + retry = true; + } +} + static bool FindGameRoot(char *path, size_t pathSize) { + char executableDir[FILEMGR_PATH_SIZE]; + if(GetExecutableDir(executableDir, sizeof(executableDir)) && + SetGameRoot(executableDir, path, pathSize)) + return true; + char cwd[FILEMGR_PATH_SIZE]; if(_getcwd(cwd, sizeof(cwd)) != nil && SetGameRoot(cwd, path, pathSize)) return true; - char executableDir[FILEMGR_PATH_SIZE]; - return GetExecutableDir(executableDir, sizeof(executableDir)) && - SetGameRoot(executableDir, path, pathSize); + return ReadGameRoot(path, pathSize) || ChooseGameRoot(path, pathSize); } #endif @@ -284,13 +371,10 @@ CFileMgr::Initialise(void) debug("Android: Root Dir: %s\n", ms_rootDirName); } #elif defined(__APPLE__) - if(FindGameRoot(ms_rootDirName, sizeof(ms_rootDirName))){ - strcpy(ms_dirName, ms_rootDirName); - mychdir(ms_rootDirName); - }else{ - _getcwd(ms_rootDirName, sizeof(ms_rootDirName)); - strcat(ms_rootDirName, "\\"); - } + if(ms_rootDirName[0] == '\0' && !FindGameRoot(ms_rootDirName, sizeof(ms_rootDirName))) + _exit(0); + strcpy(ms_dirName, ms_rootDirName); + mychdir(ms_rootDirName); #else _getcwd(ms_rootDirName, sizeof(ms_rootDirName)); strcat(ms_rootDirName, "\\"); From e0a2c43ae3d89cc488e0792e3eacb6a4d6cd589f Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 14:57:57 +0400 Subject: [PATCH 05/25] feat: create an app bundle for macOS builds --- premake5.lua | 12 ++++++++++++ res/images/reVC.icns | Bin 0 -> 212658 bytes res/macos/Info.plist | 26 ++++++++++++++++++++++++++ src/CMakeLists.txt | 19 +++++++++++++++++++ src/core/Game.cpp | 1 + 5 files changed, 58 insertions(+) create mode 100644 res/images/reVC.icns create mode 100644 res/macos/Info.plist diff --git a/premake5.lua b/premake5.lua index 30c1a40c7..eb0e82552 100644 --- a/premake5.lua +++ b/premake5.lua @@ -248,6 +248,18 @@ project "reVC" targetname "reVC" targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + filter { "system:macosx", "action:gmake*" } + files { "res/images/reVC.icns", "res/macos/Info.plist" } + postbuildcommands { + '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/MacOS"', + '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', + '{COPYFILE} "%{cfg.buildtarget.abspath}" "%{cfg.targetdir}/reVC.app/Contents/MacOS/reVC"', + '{COPYFILE} "%{prj.location}/../res/images/reVC.icns" "%{cfg.targetdir}/reVC.app/Contents/Resources/reVC.icns"', + '{COPYFILE} "%{prj.location}/../res/macos/Info.plist" "%{cfg.targetdir}/reVC.app/Contents/Info.plist"', + } + + filter {} + if(_OPTIONS["with-librw"]) then dependson "librw" end diff --git a/res/images/reVC.icns b/res/images/reVC.icns new file mode 100644 index 0000000000000000000000000000000000000000..604b7a99db6d66f6e86cfc2a0d8a91574547976f GIT binary patch literal 212658 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 K#CcY{U;iJX3tPSb literal 0 HcmV?d00001 diff --git a/res/macos/Info.plist b/res/macos/Info.plist new file mode 100644 index 000000000..55368faf3 --- /dev/null +++ b/res/macos/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + reVC + CFBundleIconFile + reVC.icns + CFBundleIdentifier + io.github.mrxenginner.reVC + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + reVC + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSHighResolutionCapable + + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 91d3b8f69..1ac07a386 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -213,6 +213,25 @@ set_target_properties(${EXECUTABLE} CXX_STANDARD_REQUIRED ON ) +if(APPLE AND NOT ANDROID) + set(${PROJECT}_MACOS_BUNDLE "$/${EXECUTABLE}.app") + add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + "${${PROJECT}_MACOS_BUNDLE}/Contents/MacOS" + "${${PROJECT}_MACOS_BUNDLE}/Contents/Resources" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$" + "${${PROJECT}_MACOS_BUNDLE}/Contents/MacOS/${EXECUTABLE}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${PROJECT_SOURCE_DIR}/res/images/reVC.icns" + "${${PROJECT}_MACOS_BUNDLE}/Contents/Resources/reVC.icns" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" + "${${PROJECT}_MACOS_BUNDLE}/Contents/Info.plist" + VERBATIM + ) +endif() + if(${PROJECT}_INSTALL) install( TARGETS ${EXECUTABLE} diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 39fc146c3..4248f14ae 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -191,6 +191,7 @@ void ReplaceAtomicPipeCallback(); bool CGame::InitialiseRenderWare(void) { + CFileMgr::SetDir(""); ValidateVersion(); #ifdef USE_TEXTURE_POOL _TexturePoolsInitialise(); From b28ba39b6863dbf0dd6a6b682f780499fdea66ba Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 19:13:02 +0400 Subject: [PATCH 06/25] feat: resolve gamefiles inside or beside the app bundle --- src/core/FileMgr.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index cc74424c0..f2c31e4f4 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -201,9 +201,22 @@ static bool FindGameRoot(char *path, size_t pathSize) { char executableDir[FILEMGR_PATH_SIZE]; - if(GetExecutableDir(executableDir, sizeof(executableDir)) && - SetGameRoot(executableDir, path, pathSize)) - return true; + if(GetExecutableDir(executableDir, sizeof(executableDir))){ + if(SetGameRoot(executableDir, path, pathSize)) + return true; + + char defaultRoot[FILEMGR_PATH_SIZE]; + int length = snprintf(defaultRoot, sizeof(defaultRoot), + "%s/../Resources/gamefiles", executableDir); + if(length >= 0 && length < (int)sizeof(defaultRoot) && + SetGameRoot(defaultRoot, path, pathSize)) + return true; + + length = snprintf(defaultRoot, sizeof(defaultRoot), "%s/../../..", executableDir); + if(length >= 0 && length < (int)sizeof(defaultRoot) && + SetGameRoot(defaultRoot, path, pathSize)) + return true; + } char cwd[FILEMGR_PATH_SIZE]; if(_getcwd(cwd, sizeof(cwd)) != nil && SetGameRoot(cwd, path, pathSize)) From 92e8c8369f3e45b7bfa14d6d771189f6905a0fb9 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 19:19:44 +0400 Subject: [PATCH 07/25] fix: distinguish ARM64 Premake platforms --- premake5.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/premake5.lua b/premake5.lua index eb0e82552..beebc547d 100644 --- a/premake5.lua +++ b/premake5.lua @@ -144,9 +144,12 @@ workspace "reVC" filter { "platforms:*amd64*" } architecture "amd64" - filter { "platforms:*arm*" } + filter { "platforms:*arm-*" } architecture "ARM" + filter { "platforms:*arm64*" } + architecture "ARM64" + filter { "platforms:macosx-arm64-*", "files:**.cpp"} buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" } From 80c34c8b6df118f5cdd7a093256914ffafaff09e Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 19:44:34 +0400 Subject: [PATCH 08/25] fix: use libmpg123 pkg-config metadata --- cmake/Findmpg123.cmake | 4 ++-- src/CMakeLists.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/Findmpg123.cmake b/cmake/Findmpg123.cmake index aa59ad826..c2e477744 100644 --- a/cmake/Findmpg123.cmake +++ b/cmake/Findmpg123.cmake @@ -9,7 +9,7 @@ find_package(PkgConfig QUIET) if(PKG_CONFIG_FOUND) - pkg_search_module(PKG_MPG123 mpg123) + pkg_search_module(PKG_MPG123 libmpg123) endif() find_path(mpg123_INCLUDE_DIR mpg123.h @@ -19,7 +19,7 @@ find_path(mpg123_INCLUDE_DIR mpg123.h ) find_library(mpg123_LIBRARIES NAMES mpg123 mpg123-0 libmpg123-0 - HINTS ${PKG_MPG123_LIBRARIES} + HINTS ${PKG_MPG123_LIBRARY_DIRS} PATHS "${mpg123_DIR}" PATH_SUFFIXES lib ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1ac07a386..760cdec48 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,7 @@ find_package(Threads REQUIRED) set(THREADS_PREFER_PTHREAD_FLAG ON) file(GLOB_RECURSE ${PROJECT}_SOURCES "*.cpp" "*.h" "*.rc") +list(REMOVE_ITEM ${PROJECT}_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/extras/GitSHA1.cpp") function(header_directories RETURN_LIST) file(GLOB_RECURSE ALL_SRCS *.h *.cpp *.c) From 66352112843e8b90add1ebe4c58a10361f020144 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sat, 29 Aug 2026 20:36:57 +0400 Subject: [PATCH 09/25] feat: add Xcode support to Premake and CMake --- premake5.lua | 124 +++++++++++++++++++++++++++++++++++---------- src/CMakeLists.txt | 24 ++++----- 2 files changed, 107 insertions(+), 41 deletions(-) diff --git a/premake5.lua b/premake5.lua index beebc547d..8ec69e71f 100644 --- a/premake5.lua +++ b/premake5.lua @@ -68,6 +68,14 @@ function getarch(a) return a end +local function dependencyincludedirs(paths) + if _ACTION == "xcode4" then + externalincludedirs(paths) + else + includedirs(paths) + end +end + workspace "reVC" language "C++" configurations { "Debug", "Release" } @@ -111,10 +119,14 @@ workspace "reVC" } filter { "system:macosx" } - platforms { - "macosx-arm64-librw_gl3_glfw-oal", - "macosx-amd64-librw_gl3_glfw-oal", - } + if _ACTION == "xcode4" then + platforms { "macosx-librw_gl3_glfw-oal" } + else + platforms { + "macosx-arm64-librw_gl3_glfw-oal", + "macosx-amd64-librw_gl3_glfw-oal", + } + end filter "configurations:Debug" defines { "DEBUG" } @@ -150,17 +162,32 @@ workspace "reVC" filter { "platforms:*arm64*" } architecture "ARM64" - filter { "platforms:macosx-arm64-*", "files:**.cpp"} + filter { "platforms:macosx-arm64-*", "action:not xcode4", "files:**.cpp"} buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" } - filter { "platforms:macosx-arm64-*", "files:**.c"} + filter { "platforms:macosx-arm64-*", "action:not xcode4", "files:**.c"} buildoptions { "-target", "arm64-apple-macos11" } - filter { "platforms:macosx-amd64-*", "files:**.cpp"} + filter { "platforms:macosx-arm64-*", "action:not xcode4" } + linkoptions { "-target", "arm64-apple-macos11" } + + filter { "platforms:macosx-amd64-*", "action:not xcode4", "files:**.cpp"} buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" } - filter { "platforms:macosx-amd64-*", "files:**.c"} + filter { "platforms:macosx-amd64-*", "action:not xcode4", "files:**.c"} buildoptions { "-target", "x86_64-apple-macos10.12" } + + filter { "platforms:macosx-amd64-*", "action:not xcode4" } + linkoptions { "-target", "x86_64-apple-macos10.12" } + + filter { "action:xcode4" } + cppdialect "gnu++14" + xcodebuildsettings { + ["ARCHS"] = { "$(ARCHS_STANDARD)" }, + ["MACOSX_DEPLOYMENT_TARGET[arch=arm64]"] = { "11.0" }, + ["MACOSX_DEPLOYMENT_TARGET[arch=x86_64]"] = { "10.12" }, + ["ONLY_ACTIVE_ARCH"] = { "YES" }, + } filter { "platforms:*librw_d3d9*" } defines { "RW_D3D9" } @@ -201,7 +228,13 @@ if(_OPTIONS["with-librw"]) then project "librw" kind "StaticLib" targetname "rw" - targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) + filter "action:not xcode4" + targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) + filter "action:xcode4" + targetdir "${BUILD_DIR}/%{cfg.buildcfg}" + + filter {} + files { path.join(Librw, "src/*.*") } files { path.join(Librw, "src/*/*.*") } files { path.join(Librw, "src/gl/*/*.*") } @@ -223,17 +256,26 @@ project "librw" -- Support MacPorts and Homebrew filter "platforms:macosx-arm64-*" - includedirs { "/opt/local/include" } - includedirs {"/opt/homebrew/include" } + dependencyincludedirs { "/opt/local/include" } + dependencyincludedirs { "/opt/homebrew/include" } libdirs { "/opt/local/lib" } libdirs { "/opt/homebrew/lib" } - + filter "platforms:macosx-amd64-*" - includedirs { "/opt/local/include" } - includedirs {"/usr/local/include" } + dependencyincludedirs { "/opt/local/include" } + dependencyincludedirs { "/usr/local/include" } libdirs { "/opt/local/lib" } libdirs { "/usr/local/lib" } - + + filter { "system:macosx", "action:xcode4" } + dependencyincludedirs { "/opt/local/include" } + dependencyincludedirs { "/opt/homebrew/include" } + dependencyincludedirs { "/usr/local/include" } + xcodebuildsettings { + ["LIBRARY_SEARCH_PATHS[arch=arm64]"] = { "$(inherited)", "/opt/local/lib", "/opt/homebrew/lib" }, + ["LIBRARY_SEARCH_PATHS[arch=x86_64]"] = { "$(inherited)", "/opt/local/lib", "/usr/local/lib" }, + } + filter "platforms:*gl3_glfw*" staticruntime "off" @@ -249,10 +291,23 @@ end project "reVC" kind "WindowedApp" targetname "reVC" - targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + filter "action:not xcode4" + targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + filter "action:xcode4" + targetdir "${BUILD_DIR}/%{cfg.buildcfg}" + + filter {} - filter { "system:macosx", "action:gmake*" } + filter { "system:macosx" } files { "res/images/reVC.icns", "res/macos/Info.plist" } + + filter { "system:macosx", "action:xcode4" } + xcodebuildsettings { + ["PRODUCT_BUNDLE_IDENTIFIER"] = "io.github.mrxenginner.reVC", + ["INSTALL_PATH"] = "$(LOCAL_APPS_DIR)", + } + + filter { "system:macosx", "action:gmake*" } postbuildcommands { '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/MacOS"', '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', @@ -319,6 +374,11 @@ project "reVC" includedirs { "src/vehicles" } includedirs { "src/weapons" } includedirs { "src/extras" } + + filter "action:xcode4" + externalincludedirs { "src/audio/eax", "src/fakerw", Librw } + + filter {} if(not _OPTIONS["no-git-hash"]) then defines { "USE_OUR_VERSIONING" } @@ -420,11 +480,11 @@ project "reVC" links { "openal", "mpg123", "sndfile", "pthread" } filter "platforms:macosx-arm64-*oal" - includedirs { "/opt/homebrew/opt/openal-soft/include" } + dependencyincludedirs { "/opt/homebrew/opt/openal-soft/include" } libdirs { "/opt/homebrew/opt/openal-soft/lib" } - + filter "platforms:macosx-amd64-*oal" - includedirs { "/usr/local/opt/openal-soft/include" } + dependencyincludedirs { "/usr/local/opt/openal-soft/include" } libdirs { "/usr/local/opt/openal-soft/lib" } if _OPTIONS["with-opus"] then @@ -446,7 +506,7 @@ project "reVC" files { addSrcFiles("src/fakerw") } includedirs { "src/fakerw" } includedirs { Librw } - if(_OPTIONS["with-librw"]) then + if(_OPTIONS["with-librw"] and _ACTION ~= "xcode4") then libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" } end links { "rw" } @@ -478,15 +538,27 @@ project "reVC" filter "platforms:macosx-arm64-*gl3_glfw*" links { "glfw" } linkoptions { "-framework OpenGL" } - includedirs { "/opt/local/include" } - includedirs {"/opt/homebrew/include" } + dependencyincludedirs { "/opt/local/include" } + dependencyincludedirs { "/opt/homebrew/include" } libdirs { "/opt/local/lib" } libdirs { "/opt/homebrew/lib" } - + filter "platforms:macosx-amd64-*gl3_glfw*" links { "glfw" } linkoptions { "-framework OpenGL" } - includedirs { "/opt/local/include" } - includedirs {"/usr/local/include" } + dependencyincludedirs { "/opt/local/include" } + dependencyincludedirs { "/usr/local/include" } libdirs { "/opt/local/lib" } libdirs { "/usr/local/lib" } + + filter { "system:macosx", "action:xcode4" } + links { "glfw", "OpenGL.framework" } + dependencyincludedirs { "/opt/local/include" } + dependencyincludedirs { "/opt/homebrew/include" } + dependencyincludedirs { "/usr/local/include" } + dependencyincludedirs { "/opt/homebrew/opt/openal-soft/include" } + dependencyincludedirs { "/usr/local/opt/openal-soft/include" } + xcodebuildsettings { + ["LIBRARY_SEARCH_PATHS[arch=arm64]"] = { "$(inherited)", "/opt/local/lib", "/opt/homebrew/lib", "/opt/homebrew/opt/openal-soft/lib" }, + ["LIBRARY_SEARCH_PATHS[arch=x86_64]"] = { "$(inherited)", "/opt/local/lib", "/usr/local/lib", "/usr/local/opt/openal-soft/lib" }, + } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 760cdec48..e737a3cb6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -215,21 +215,15 @@ set_target_properties(${EXECUTABLE} ) if(APPLE AND NOT ANDROID) - set(${PROJECT}_MACOS_BUNDLE "$/${EXECUTABLE}.app") - add_custom_command(TARGET ${EXECUTABLE} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory - "${${PROJECT}_MACOS_BUNDLE}/Contents/MacOS" - "${${PROJECT}_MACOS_BUNDLE}/Contents/Resources" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "$" - "${${PROJECT}_MACOS_BUNDLE}/Contents/MacOS/${EXECUTABLE}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${PROJECT_SOURCE_DIR}/res/images/reVC.icns" - "${${PROJECT}_MACOS_BUNDLE}/Contents/Resources/reVC.icns" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" - "${${PROJECT}_MACOS_BUNDLE}/Contents/Info.plist" - VERBATIM + set(${PROJECT}_MACOS_ICON "${PROJECT_SOURCE_DIR}/res/images/reVC.icns") + target_sources(${EXECUTABLE} PRIVATE "${${PROJECT}_MACOS_ICON}") + set_source_files_properties("${${PROJECT}_MACOS_ICON}" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + ) + set_target_properties(${EXECUTABLE} PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "io.github.mrxenginner.reVC" ) endif() From e922ebf8c19c76789952bf9a1c96044251190d79 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 03:00:25 +0400 Subject: [PATCH 10/25] chore: ignore .DS_Store files --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c55a27cea..754d03e88 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +# macOS +.DS_Store + # User-specific files *.rsuser *.suo @@ -360,4 +363,4 @@ codewarrior/reVC_Data/ codewarrior/Release/ codewarrior/Debug/ -src/extras/GitSHA1.cpp \ No newline at end of file +src/extras/GitSHA1.cpp From 046f6e5e951465dcf6ce1457731f6d0c426f9c0c Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 03:22:07 +0400 Subject: [PATCH 11/25] fix: center mouse cursor when launching and quitting the game --- src/core/Frontend.cpp | 15 ++------------- src/skel/glfw/glfw.cpp | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 35b746312..2513bfcdf 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -627,19 +627,8 @@ void CMenuManager::CentreMousePointer() { if (SCREEN_WIDTH * 0.5f != 0.0f && 0.0f != SCREEN_HEIGHT * 0.5f) { -#if defined RW_D3D9 || defined RWLIBS - tagPOINT Point; - Point.x = SCREEN_WIDTH / 2; - Point.y = SCREEN_HEIGHT / 2; - ClientToScreen(PSGLOBAL(window), &Point); - SetCursorPos(Point.x, Point.y); -#elif defined RW_GL3 && !defined(LIBRW_SDL2) - glfwSetCursorPos(PSGLOBAL(window), SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); -#elif defined(RW_GL3) && defined(LIBRW_SDL2) - SDL_WarpMouseInWindow(PSGLOBAL(window), SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); -#endif - PSGLOBAL(lastMousePos.x) = SCREEN_WIDTH / 2; - PSGLOBAL(lastMousePos.y) = SCREEN_HEIGHT / 2; + RwV2d pos = { SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 }; + RsMouseSetPos(&pos); } } diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 0c0fefbcd..75b13f0d8 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -78,6 +78,7 @@ static RwBool RwInitialised = FALSE; static RwSubSystemInfo GsubSysInfo[MAX_SUBSYSTEMS]; static RwInt32 GnumSubSystems = 0; static RwInt32 GcurSel = 0, GcurSelVM = 0; +static RwInt32 desktopWidth = 0, desktopHeight = 0; static RwBool useDefault; @@ -276,7 +277,17 @@ psTimer(void) void psMouseSetPos(RwV2d *pos) { - glfwSetCursorPos(PSGLOBAL(window), pos->x, pos->y); + int winw, winh; + glfwGetWindowSize(PSGLOBAL(window), &winw, &winh); + glfwSetCursorPos(PSGLOBAL(window), + pos->x * (double)winw / RsGlobal.maximumWidth, + pos->y * (double)winh / RsGlobal.maximumHeight); + FrontEndMenuManager.m_nMouseTempPosX = pos->x; + FrontEndMenuManager.m_nMouseTempPosY = pos->y; + FrontEndMenuManager.m_nMousePosX = pos->x; + FrontEndMenuManager.m_nMousePosY = pos->y; + FrontEndMenuManager.m_nMouseOldPosX = pos->x; + FrontEndMenuManager.m_nMouseOldPosY = pos->y; if (glfwGetWindowAttrib(PSGLOBAL(window), GLFW_FOCUSED)) PSGLOBAL(cursorIsInWindow) = true; @@ -747,7 +758,12 @@ psSelectDevice() RwVideoMode vm; RwInt32 subSysNum; RwInt32 AutoRenderer = 0; - + + const GLFWvidmode *desktopMode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + if (desktopMode) { + desktopWidth = desktopMode->width; + desktopHeight = desktopMode->height; + } RwBool modeFound = FALSE; @@ -1055,7 +1071,15 @@ long _InputInitialiseMouse(bool exclusive) void _InputShutdownMouse() { - // Not needed + lastCursorMode = GLFW_CURSOR_NORMAL; + glfwSetInputMode(PSGLOBAL(window), GLFW_CURSOR, lastCursorMode); +} + +static void +centreMouseForDesktop() +{ + if (desktopWidth > 0 && desktopHeight > 0) + glfwSetCursorPos(PSGLOBAL(window), desktopWidth * 0.5, desktopHeight * 0.5); } // Not "needs exclusive" on GLFW, but more like "needs to change mode" @@ -1106,7 +1130,9 @@ void psPostRWinit(void) RwBool _psSetVideoMode(RwInt32 subSystem, RwInt32 videoMode) { RwInitialised = FALSE; - + + _InputShutdownMouse(); + centreMouseForDesktop(); RsEventHandler(rsRWTERMINATE, nil); GcurSel = subSystem; @@ -1864,8 +1890,8 @@ cursorCB(GLFWwindow* window, double xpos, double ypos) { int winw, winh; glfwGetWindowSize(PSGLOBAL(window), &winw, &winh); - FrontEndMenuManager.m_nMouseTempPosX = xpos * (RsGlobal.maximumWidth / winw); - FrontEndMenuManager.m_nMouseTempPosY = ypos * (RsGlobal.maximumHeight / winh); + FrontEndMenuManager.m_nMouseTempPosX = xpos * ((double)RsGlobal.maximumWidth / winw); + FrontEndMenuManager.m_nMouseTempPosY = ypos * ((double)RsGlobal.maximumHeight / winh); } void @@ -2468,6 +2494,8 @@ main(int argc, char *argv[]) /* * Tidy up the 3D (RenderWare) components of the application... */ + _InputShutdownMouse(); + centreMouseForDesktop(); RsEventHandler(rsRWTERMINATE, nil); /* From f7bf1f1a84c6486e82caabb8abe590fb4d37cbe7 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 11:07:20 +0400 Subject: [PATCH 12/25] fix: address a TODO comment --- src/core/Frontend.cpp | 1 - src/skel/glfw/glfw.cpp | 3 ++- src/skel/sdl2/sdl2.cpp | 3 ++- src/skel/win/win.cpp | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 2513bfcdf..fe015f412 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -4855,7 +4855,6 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u DMAudio.Service(); CentreMousePointer(); m_bShowMouse = true; - m_nCurrOption = 5; // TODO(Miami): Because selected option is resetted after res. change. We'll need to revisit that. m_nOptionHighlightTransitionBlend = 0; SaveSettings(); } diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 75b13f0d8..826d4f341 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -924,7 +924,8 @@ psSelectDevice() #endif #ifndef PS2_MENU - FrontEndMenuManager.m_nCurrOption = 0; + if (!useDefault) + FrontEndMenuManager.m_nCurrOption = 0; #endif /* Set up the video mode and set the apps window diff --git a/src/skel/sdl2/sdl2.cpp b/src/skel/sdl2/sdl2.cpp index 47b943f39..ef3d8d15a 100644 --- a/src/skel/sdl2/sdl2.cpp +++ b/src/skel/sdl2/sdl2.cpp @@ -617,7 +617,8 @@ psSelectDevice() #endif #ifndef PS2_MENU - FrontEndMenuManager.m_nCurrOption = 0; + if (!useDefault) + FrontEndMenuManager.m_nCurrOption = 0; #endif /* Set up the video mode and set the apps window diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index c49f0ab96..3e7a26c4e 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -1566,7 +1566,8 @@ psSelectDevice() #endif #ifndef PS2_MENU - FrontEndMenuManager.m_nCurrOption = 0; + if (!useDefault) + FrontEndMenuManager.m_nCurrOption = 0; #endif /* Set up the video mode and set the apps window From 65ae7ba9636f4bb1daf98031a91c0bac7faa5679 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 12:01:55 +0400 Subject: [PATCH 13/25] feat: bundle reVC gamefiles as runtime overrides --- premake5.lua | 7 ++++ src/CMakeLists.txt | 8 ++++ src/core/FileMgr.cpp | 89 ++++++++++++++++++++++++++++++++++++++---- src/core/FileMgr.h | 1 + src/fakerw/fake.cpp | 10 +++-- src/skel/glfw/glfw.cpp | 15 +++---- src/skel/sdl2/sdl2.cpp | 5 ++- 7 files changed, 115 insertions(+), 20 deletions(-) diff --git a/premake5.lua b/premake5.lua index 8ec69e71f..1eb615cc8 100644 --- a/premake5.lua +++ b/premake5.lua @@ -306,6 +306,11 @@ project "reVC" ["PRODUCT_BUNDLE_IDENTIFIER"] = "io.github.mrxenginner.reVC", ["INSTALL_PATH"] = "$(LOCAL_APPS_DIR)", } + postbuildcommands { + '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', + '{RMDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources/gamefiles"', + '{COPYDIR} "%{prj.location}/../gamefiles" "%{cfg.targetdir}/reVC.app/Contents/Resources"', + } filter { "system:macosx", "action:gmake*" } postbuildcommands { @@ -314,6 +319,8 @@ project "reVC" '{COPYFILE} "%{cfg.buildtarget.abspath}" "%{cfg.targetdir}/reVC.app/Contents/MacOS/reVC"', '{COPYFILE} "%{prj.location}/../res/images/reVC.icns" "%{cfg.targetdir}/reVC.app/Contents/Resources/reVC.icns"', '{COPYFILE} "%{prj.location}/../res/macos/Info.plist" "%{cfg.targetdir}/reVC.app/Contents/Info.plist"', + '{RMDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources/gamefiles"', + '{COPYDIR} "%{prj.location}/../gamefiles" "%{cfg.targetdir}/reVC.app/Contents/Resources"', } filter {} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e737a3cb6..4fa63e6ce 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -225,6 +225,14 @@ if(APPLE AND NOT ANDROID) MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "io.github.mrxenginner.reVC" ) + add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E remove_directory + "$/Resources/gamefiles" + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${PROJECT_SOURCE_DIR}/gamefiles" + "$/Resources/gamefiles" + COMMENT "Copying gamefiles into the app bundle" + ) endif() if(${PROJECT}_INSTALL) diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index f2c31e4f4..cf7ba5364 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -66,6 +66,8 @@ void mychdir(char const *path) #endif #ifdef __APPLE__ +static char bundledGameFilesDir[FILEMGR_PATH_SIZE] = {'\0'}; + static bool GameFileExists(const char *root, const char *name) { @@ -114,6 +116,29 @@ GetExecutableDir(char *path, size_t pathSize) return length >= 0 && length < (int)pathSize; } +static bool +FindBundledGameFiles(char *path, size_t pathSize) +{ + char executableDir[FILEMGR_PATH_SIZE]; + if(!GetExecutableDir(executableDir, sizeof(executableDir))) + return false; + + char bundleDir[FILEMGR_PATH_SIZE]; + int length = snprintf(bundleDir, sizeof(bundleDir), + "%s/../Resources/gamefiles", executableDir); + if(length < 0 || length >= (int)sizeof(bundleDir)) + return false; + + char realBundleDir[FILEMGR_PATH_SIZE]; + struct stat status; + if(realpath(bundleDir, realBundleDir) == nil || + stat(realBundleDir, &status) != 0 || !S_ISDIR(status.st_mode)) + return false; + + length = snprintf(path, pathSize, "%s", realBundleDir); + return length >= 0 && length < (int)pathSize; +} + static bool GetGameRootFile(char *dir, size_t dirSize, char *path, size_t pathSize) { @@ -206,13 +231,7 @@ FindGameRoot(char *path, size_t pathSize) return true; char defaultRoot[FILEMGR_PATH_SIZE]; - int length = snprintf(defaultRoot, sizeof(defaultRoot), - "%s/../Resources/gamefiles", executableDir); - if(length >= 0 && length < (int)sizeof(defaultRoot) && - SetGameRoot(defaultRoot, path, pathSize)) - return true; - - length = snprintf(defaultRoot, sizeof(defaultRoot), "%s/../../..", executableDir); + int length = snprintf(defaultRoot, sizeof(defaultRoot), "%s/../../..", executableDir); if(length >= 0 && length < (int)sizeof(defaultRoot) && SetGameRoot(defaultRoot, path, pathSize)) return true; @@ -232,6 +251,13 @@ myfopen(const char *filename, const char *mode) { int fd; char realmode[10], *p; + const char *openPath = filename; +#ifdef __APPLE__ + char bundledPath[FILEMGR_PATH_SIZE]; + if(mode[0] == 'r' && strchr(mode, '+') == nil && + CFileMgr::ResolveBundledGameFile(filename, bundledPath, sizeof(bundledPath))) + openPath = bundledPath; +#endif for(fd = 1; fd < NUMFILES; fd++) if(myfiles[fd].file == nil) @@ -248,7 +274,7 @@ myfopen(const char *filename, const char *mode) *p++ = 'b'; *p = '\0'; - myfiles[fd].file = fcaseopen(filename, realmode); + myfiles[fd].file = fcaseopen(openPath, realmode); if(myfiles[fd].file == nil) return 0; return fd; @@ -384,6 +410,7 @@ CFileMgr::Initialise(void) debug("Android: Root Dir: %s\n", ms_rootDirName); } #elif defined(__APPLE__) + FindBundledGameFiles(bundledGameFilesDir, sizeof(bundledGameFilesDir)); if(ms_rootDirName[0] == '\0' && !FindGameRoot(ms_rootDirName, sizeof(ms_rootDirName))) _exit(0); strcpy(ms_dirName, ms_rootDirName); @@ -394,6 +421,52 @@ CFileMgr::Initialise(void) #endif } +bool +CFileMgr::ResolveBundledGameFile(const char *file, char *path, size_t pathSize) +{ +#ifdef __APPLE__ + const char *rootDir = CFileMgr::GetRootDirName(); + if(bundledGameFilesDir[0] == '\0' || rootDir[0] == '\0' || + file[0] == '\0' || file[0] == '/' || file[0] == '\\') + return false; + + char cwd[FILEMGR_PATH_SIZE]; + if(_getcwd(cwd, sizeof(cwd)) == nil) + return false; + + size_t rootLength = strlen(rootDir); + while(rootLength > 0 && rootDir[rootLength - 1] == '/') + rootLength--; + if(strncmp(cwd, rootDir, rootLength) != 0 || + (cwd[rootLength] != '\0' && cwd[rootLength] != '/')) + return false; + + char candidate[FILEMGR_PATH_SIZE]; + int length = snprintf(candidate, sizeof(candidate), "%s%s/%s", + bundledGameFilesDir, cwd + rootLength, file); + if(length < 0 || length >= (int)sizeof(candidate)) + return false; + + char *realPath = casepath(candidate); + const char *resolvedPath = realPath == nil ? candidate : realPath; + FILE *bundleFile = fopen(resolvedPath, "rb"); + if(bundleFile == nil){ + free(realPath); + return false; + } + fclose(bundleFile); + + length = snprintf(path, pathSize, "%s", resolvedPath); + free(realPath); + return length >= 0 && length < (int)pathSize; +#else + (void)file; + (void)path; + (void)pathSize; + return false; +#endif +} + void CFileMgr::ChangeDir(const char *dir) { diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h index 420d5ad23..0f813400e 100644 --- a/src/core/FileMgr.h +++ b/src/core/FileMgr.h @@ -22,6 +22,7 @@ class CFileMgr static bool ReadLine(int fd, char *buf, int len); static int CloseFile(int fd); static int GetErrorReadWrite(int fd); + static bool ResolveBundledGameFile(const char *file, char *path, size_t pathSize); static char *GetRootDirName() { return ms_rootDirName; } }; diff --git a/src/fakerw/fake.cpp b/src/fakerw/fake.cpp index ee779788d..208c9343f 100644 --- a/src/fakerw/fake.cpp +++ b/src/fakerw/fake.cpp @@ -1,15 +1,13 @@ #define _CRT_SECURE_NO_WARNINGS #define WITH_D3D // not WITHD3D, so it's librw define -#include -#include +#include "common.h" #include -#include -#include #include #include #ifndef _WIN32 #include "crossplatform.h" #endif +#include "FileMgr.h" using namespace rw; @@ -347,6 +345,7 @@ RwStream *RwStreamOpen(RwStreamType type, RwStreamAccessType accessType, const v StreamMemory *mem; RwMemory *memargs; const char *mode; + char bundledPath[FILEMGR_PATH_SIZE]; switch(accessType){ case rwSTREAMREAD: mode = "rb"; break; @@ -358,6 +357,9 @@ RwStream *RwStreamOpen(RwStreamType type, RwStreamAccessType accessType, const v // oh god this is horrible. librw streams really need fixing switch(type){ case rwSTREAMFILENAME:{ + if(accessType == rwSTREAMREAD && + CFileMgr::ResolveBundledGameFile((const char*)pData, bundledPath, sizeof(bundledPath))) + pData = bundledPath; StreamFile fakefile; file = rwNewT(StreamFile, 1, 0); memcpy(file, &fakefile, sizeof(StreamFile)); diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 826d4f341..066fe6a3b 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -1009,8 +1009,11 @@ void _InputInitialiseJoys() PSGLOBAL(joy2id) = -1; // Load our gamepad mappings. -#define SDL_GAMEPAD_DB_PATH "gamecontrollerdb.txt" - FILE *f = fopen(SDL_GAMEPAD_DB_PATH, "rb"); + char bundledPath[FILEMGR_PATH_SIZE]; + const char *gamepadDbPath = CFileMgr::ResolveBundledGameFile( + "gamecontrollerdb.txt", bundledPath, sizeof(bundledPath)) ? + bundledPath : "gamecontrollerdb.txt"; + FILE *f = fcaseopen(gamepadDbPath, "rb"); if (f) { fseek(f, 0, SEEK_END); size_t fsize = ftell(f); @@ -1021,16 +1024,14 @@ void _InputInitialiseJoys() db[fsize] = '\0'; if (glfwUpdateGamepadMappings(db) == GLFW_FALSE) - Error("glfwUpdateGamepadMappings didn't succeed, check " SDL_GAMEPAD_DB_PATH ".\n"); + Error("glfwUpdateGamepadMappings didn't succeed, check %s.\n", gamepadDbPath); } else - Error("fread on " SDL_GAMEPAD_DB_PATH " wasn't successful.\n"); + Error("fread on %s wasn't successful.\n", gamepadDbPath); free(db); fclose(f); } else - printf("You don't seem to have copied " SDL_GAMEPAD_DB_PATH " file from reVC/gamefiles to GTA: Vice City directory. Some gamepads may not be recognized.\n"); - -#undef SDL_GAMEPAD_DB_PATH + printf("You don't seem to have copied %s file from reVC/gamefiles to GTA: Vice City directory. Some gamepads may not be recognized.\n", gamepadDbPath); // But always overwrite it with the one in SDL_GAMECONTROLLERCONFIG. char const* EnvControlConfig = getenv("SDL_GAMECONTROLLERCONFIG"); diff --git a/src/skel/sdl2/sdl2.cpp b/src/skel/sdl2/sdl2.cpp index ef3d8d15a..2b1dd94c2 100644 --- a/src/skel/sdl2/sdl2.cpp +++ b/src/skel/sdl2/sdl2.cpp @@ -704,7 +704,10 @@ void _InputInitialiseJoys() char SDL_GAMEPAD_DB_PATH[MAX_PATH]; snprintf(SDL_GAMEPAD_DB_PATH, sizeof(SDL_GAMEPAD_DB_PATH), "%s%s", pathRoot, "gamecontrollerdb.txt"); #else - const char* SDL_GAMEPAD_DB_PATH = "gamecontrollerdb.txt"; + char bundledPath[FILEMGR_PATH_SIZE]; + const char* SDL_GAMEPAD_DB_PATH = CFileMgr::ResolveBundledGameFile( + "gamecontrollerdb.txt", bundledPath, sizeof(bundledPath)) ? + bundledPath : "gamecontrollerdb.txt"; #endif if (SDL_GameControllerAddMappingsFromFile(SDL_GAMEPAD_DB_PATH) <= 0) { debug ("You don't seem to have copied %s file from reVC/gamefiles " From 07fe3c046eeeebbd5913beee122e61309752bd22 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 12:27:06 +0400 Subject: [PATCH 14/25] feat: use macOS user directories for saves and settings --- src/core/re3.cpp | 12 ++++++++ src/save/PCSave.cpp | 4 ++- src/skel/crossplatform.cpp | 56 ++++++++++++++++++++++++++++++++++++++ src/skel/crossplatform.h | 4 +++ src/skel/glfw/glfw.cpp | 2 ++ src/skel/sdl2/sdl2.cpp | 4 +++ 6 files changed, 81 insertions(+), 1 deletion(-) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 901d36afb..44d56eaa9 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -197,7 +197,19 @@ CustomFrontendOptionsPopulate(void) #define MINI_CASE_SENSITIVE #include "ini.h" +#ifdef __APPLE__ +static const char * +GetINIFilePath() +{ + static char path[PATH_MAX]; + int length = snprintf(path, sizeof(path), "%s/reVC.ini", GetMacOSUserFilesFolder()); + return length >= 0 && length < (int)sizeof(path) ? path : "reVC.ini"; +} + +mINI::INIFile ini(GetINIFilePath()); +#else mINI::INIFile ini("reVC.ini"); +#endif mINI::INIStructure cfg; bool ReadIniIfExists(const char *cat, const char *key, uint32 *out) diff --git a/src/save/PCSave.cpp b/src/save/PCSave.cpp index 9fc0b2d87..8e6b9d3d6 100644 --- a/src/save/PCSave.cpp +++ b/src/save/PCSave.cpp @@ -19,9 +19,11 @@ C_PcSave PcSaveHelper; void C_PcSave::SetSaveDirectory(const char *path) { -#if defined ANDROID +#if defined ANDROID || defined __APPLE__ sprintf(DefaultPCSaveFileName, "%s/%s", path, "GTAVCsf"); +#if defined ANDROID debug("SetSaveDirectory: %s", DefaultPCSaveFileName); +#endif #else sprintf(DefaultPCSaveFileName, "%s\\%s", path, "GTAVCsf"); #endif diff --git a/src/skel/crossplatform.cpp b/src/skel/crossplatform.cpp index 99ec599d2..5af59d817 100644 --- a/src/skel/crossplatform.cpp +++ b/src/skel/crossplatform.cpp @@ -2,6 +2,62 @@ #include "crossplatform.h" #include "FileMgr.h" +#ifdef __APPLE__ +#include +#include +#include +#include + +static bool +CreateDirectoryTree(const char *path) +{ + char current[PATH_MAX]; + int length = snprintf(current, sizeof(current), "%s", path); + if(length < 0 || length >= (int)sizeof(current)) + return false; + + for(char *separator = current + 1; *separator != '\0'; separator++){ + if(*separator != '/') + continue; + + *separator = '\0'; + if(mkdir(current, 0755) != 0 && errno != EEXIST){ + *separator = '/'; + return false; + } + *separator = '/'; + } + + return mkdir(current, 0755) == 0 || errno == EEXIST; +} + +const char * +GetMacOSUserFilesFolder() +{ + static char path[PATH_MAX]; + const char *home = getenv("HOME"); + if(home == nil || home[0] == '\0'){ + struct passwd *user = getpwuid(getuid()); + home = user == nil ? nil : user->pw_dir; + } + if(home == nil || home[0] == '\0') + return "userfiles"; + +#ifdef USE_MY_DOCUMENTS + const char *relativePath = "Library/Application Support/Grand Theft Auto - Vice City/p_drive/Documents/GTA Vice City User Files"; +#else + const char *relativePath = "Library/Application Support/reVC"; +#endif + int length = snprintf(path, sizeof(path), "%s/%s", home, relativePath); + if(length < 0 || length >= (int)sizeof(path)) + return "userfiles"; + + if(!CreateDirectoryTree(path)) + debug("Couldn't create macOS user files directory: %s\n", path); + return path; +} +#endif + // Codes compatible with Windows and Linux #ifndef _WIN32 diff --git a/src/skel/crossplatform.h b/src/skel/crossplatform.h index e48d3b2c4..797dd5a5c 100644 --- a/src/skel/crossplatform.h +++ b/src/skel/crossplatform.h @@ -110,6 +110,10 @@ extern RwUInt32 gGameState; RwBool IsForegroundApp(); +#ifdef __APPLE__ +const char *GetMacOSUserFilesFolder(); +#endif + #ifndef MAX_PATH #if !defined _WIN32 || defined __MINGW32__ #define MAX_PATH PATH_MAX diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 066fe6a3b..9cbfc759e 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -168,6 +168,8 @@ const char *_psGetUserFilesFolder() strcpy(szUserFiles, "data"); return szUserFiles; +#elif defined __APPLE__ + return GetMacOSUserFilesFolder(); #else static char szUserFiles[256]; strcpy(szUserFiles, "userfiles"); diff --git a/src/skel/sdl2/sdl2.cpp b/src/skel/sdl2/sdl2.cpp index 2b1dd94c2..6fe71c790 100644 --- a/src/skel/sdl2/sdl2.cpp +++ b/src/skel/sdl2/sdl2.cpp @@ -106,10 +106,14 @@ void _psCreateFolder(const char *path) */ const char *_psGetUserFilesFolder() { +#ifdef __APPLE__ + return GetMacOSUserFilesFolder(); +#else static char szUserFiles[256]; strcpy(szUserFiles, "userfiles"); _psCreateFolder(szUserFiles); return szUserFiles; +#endif } /* From ad3a5c042010fad57e4284f7e73e47a51be56254 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 12:30:20 +0400 Subject: [PATCH 15/25] refactor: store macOS game path in reVC.ini --- src/core/FileMgr.cpp | 42 +++--------------------------------------- src/core/main.h | 4 ++++ src/core/re3.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index cf7ba5364..3ba8ce9fd 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -11,6 +11,7 @@ #include "crossplatform.h" #include "FileMgr.h" +#include "main.h" const char *_psGetUserFilesFolder(); @@ -139,56 +140,19 @@ FindBundledGameFiles(char *path, size_t pathSize) return length >= 0 && length < (int)pathSize; } -static bool -GetGameRootFile(char *dir, size_t dirSize, char *path, size_t pathSize) -{ - const char *home = getenv("HOME"); - if(home == nil || *home == '\0') - return false; - - int len = snprintf(dir, dirSize, "%s/Library/Application Support/reVC", home); - if(len < 0 || len >= (int)dirSize) - return false; - len = snprintf(path, pathSize, "%s/gamefiles", dir); - return len >= 0 && len < (int)pathSize; -} - static bool ReadGameRoot(char *path, size_t pathSize) { - char dir[FILEMGR_PATH_SIZE]; - char fileName[FILEMGR_PATH_SIZE]; - if(!GetGameRootFile(dir, sizeof(dir), fileName, sizeof(fileName))) - return false; - - FILE *file = fopen(fileName, "r"); - if(file == nil) - return false; - char root[FILEMGR_PATH_SIZE]; - bool found = fgets(root, sizeof(root), file) != nil; - fclose(file); - if(!found) + if(!ReadGamePathFromINI(root, sizeof(root))) return false; - - root[strcspn(root, "\r\n")] = '\0'; return SetGameRoot(root, path, pathSize); } static void WriteGameRoot(const char *root) { - char dir[FILEMGR_PATH_SIZE]; - char fileName[FILEMGR_PATH_SIZE]; - if(!GetGameRootFile(dir, sizeof(dir), fileName, sizeof(fileName))) - return; - - mkdir(dir, 0755); - FILE *file = fopen(fileName, "w"); - if(file != nil){ - fprintf(file, "%s\n", root); - fclose(file); - } + WriteGamePathToINI(root); } static bool diff --git a/src/core/main.h b/src/core/main.h index 28fa9cc54..1471ff90a 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -61,6 +61,10 @@ bool LoadINISettings(); void SaveINISettings(); void LoadINIControllerSettings(); void SaveINIControllerSettings(); +#ifdef __APPLE__ +bool ReadGamePathFromINI(char *path, size_t pathSize); +void WriteGamePathToINI(const char *path); +#endif #endif #ifdef NEW_RENDERER diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 44d56eaa9..d16088fbe 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -212,6 +212,32 @@ mINI::INIFile ini("reVC.ini"); #endif mINI::INIStructure cfg; +#ifdef __APPLE__ +bool +ReadGamePathFromINI(char *path, size_t pathSize) +{ + mINI::INIStructure settings; + if(!ini.read(settings)) + return false; + + mINI::INIMap general = settings.get("General"); + if(!general.has("GamePath")) + return false; + + int length = snprintf(path, pathSize, "%s", general.get("GamePath").c_str()); + return length >= 0 && length < (int)pathSize; +} + +void +WriteGamePathToINI(const char *path) +{ + mINI::INIStructure settings; + ini.read(settings); + settings["General"]["GamePath"] = path; + ini.write(settings); +} +#endif + bool ReadIniIfExists(const char *cat, const char *key, uint32 *out) { mINI::INIMap section = cfg.get(cat); From dcb73c2c2d3a124a1576768357b4f1e93b22d228 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 22:11:00 +0400 Subject: [PATCH 16/25] fix: make Xcode recognize the archive as a macOS app archive --- premake5.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/premake5.lua b/premake5.lua index 1eb615cc8..293ad1b76 100644 --- a/premake5.lua +++ b/premake5.lua @@ -232,6 +232,9 @@ project "librw" targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) filter "action:xcode4" targetdir "${BUILD_DIR}/%{cfg.buildcfg}" + xcodebuildsettings { + ["SKIP_INSTALL"] = "YES", + } filter {} From 3e7e2f1d3a4b41e9a51c73bb5bc3548b27f4ed78 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Sun, 30 Aug 2026 22:22:30 +0400 Subject: [PATCH 17/25] fix: enable Hardened Runtime for the Xcode app target --- premake5.lua | 1 + src/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/premake5.lua b/premake5.lua index 293ad1b76..bf5602159 100644 --- a/premake5.lua +++ b/premake5.lua @@ -308,6 +308,7 @@ project "reVC" xcodebuildsettings { ["PRODUCT_BUNDLE_IDENTIFIER"] = "io.github.mrxenginner.reVC", ["INSTALL_PATH"] = "$(LOCAL_APPS_DIR)", + ["ENABLE_HARDENED_RUNTIME"] = "YES", } postbuildcommands { '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4fa63e6ce..9002f5d41 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -224,6 +224,7 @@ if(APPLE AND NOT ANDROID) MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "io.github.mrxenginner.reVC" + XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" ) add_custom_command(TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory From 6ef6ce8c3e444c77cfb9b9fb57bbefc0f4278534 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Mon, 31 Aug 2026 17:27:15 +0400 Subject: [PATCH 18/25] =?UTF-8?q?fix:=20support=20CMake=E2=80=99s=20Xcode?= =?UTF-8?q?=20generator=20on=20macOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 67 ++++++++++++++++++++++++++++++++++++++++++++ res/macos/Info.plist | 9 ++++++ src/CMakeLists.txt | 21 ++++++++++++-- 3 files changed, 94 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d29a8346..8ebabb584 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,29 @@ cmake_minimum_required(VERSION 3.14) set(EXECUTABLE reVC) set(PROJECT REVC) +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") + if(CMAKE_GENERATOR STREQUAL "Xcode") + set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "macOS architectures") + if(NOT CMAKE_OSX_DEPLOYMENT_TARGET) + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING + "Minimum macOS version" FORCE) + endif() + if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "11.0") + set("CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET[arch=arm64]" "11.0") + endif() + elseif(NOT CMAKE_OSX_DEPLOYMENT_TARGET) + if(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64" OR + (NOT CMAKE_OSX_ARCHITECTURES AND + CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")) + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING + "Minimum macOS version" FORCE) + else() + set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING + "Minimum macOS version" FORCE) + endif() + endif() +endif() + project(${EXECUTABLE} C CXX) set(${PROJECT}_AUTHOR "${PROJECT} Team") list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") @@ -11,6 +34,47 @@ include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR") message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}") +if(APPLE AND CMAKE_GENERATOR STREQUAL "Xcode") + set(${PROJECT}_HOMEBREW_ARM64_PREFIX "/opt/homebrew" CACHE PATH "arm64 Homebrew prefix") + set(${PROJECT}_HOMEBREW_X86_64_PREFIX "/usr/local" CACHE PATH "x86_64 Homebrew prefix") + + function(reVC_macos_homebrew_dependency target alias formula library) + set(include_prefix) + set(link_options) + foreach(architecture arm64 x86_64) + if(architecture IN_LIST CMAKE_OSX_ARCHITECTURES) + string(TOUPPER "${architecture}" architecture_upper) + set(prefix "${${PROJECT}_HOMEBREW_${architecture_upper}_PREFIX}") + if(NOT EXISTS "${prefix}/opt/${formula}/lib/lib${library}.dylib") + message(FATAL_ERROR + "${architecture} ${formula} was not found under ${prefix}" + ) + endif() + if(NOT include_prefix) + set(include_prefix "${prefix}") + endif() + list(APPEND link_options + "SHELL:-Xarch_${architecture} -L${prefix}/opt/${formula}/lib" + ) + endif() + endforeach() + + add_library(${target} INTERFACE) + add_library(${alias} ALIAS ${target}) + target_include_directories(${target} INTERFACE + "${include_prefix}/opt/${formula}/include" + ) + target_link_options(${target} INTERFACE ${link_options} "-l${library}") + endfunction() + + if("arm64" IN_LIST CMAKE_OSX_ARCHITECTURES OR + "x86_64" IN_LIST CMAKE_OSX_ARCHITECTURES) + reVC_macos_homebrew_dependency(${PROJECT}_macos_openal OpenAL::OpenAL openal-soft openal) + reVC_macos_homebrew_dependency(${PROJECT}_macos_glfw glfw glfw glfw) + reVC_macos_homebrew_dependency(${PROJECT}_macos_mpg123 MPG123::libmpg123 mpg123 mpg123) + endif() +endif() + if(NINTENDO_SWITCH) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx") @@ -42,6 +106,9 @@ endif() option(${PROJECT}_VENDORED_LIBRW "Use vendored librw" ON) if(${PROJECT}_VENDORED_LIBRW) + if(NOT DEFINED LIBRW_PLATFORM AND NOT PS2) + set(LIBRW_PLATFORM "GL3" CACHE STRING "librw platform") + endif() add_subdirectory(vendor/librw) else() find_package(librw REQUIRED) diff --git a/res/macos/Info.plist b/res/macos/Info.plist index 55368faf3..635165fbb 100644 --- a/res/macos/Info.plist +++ b/res/macos/Info.plist @@ -20,6 +20,15 @@ 1.0 CFBundleVersion 1 + LSMinimumSystemVersion + 10.12 + LSMinimumSystemVersionByArchitecture + + arm64 + 11.0 + x86_64 + 10.12 + NSHighResolutionCapable diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9002f5d41..745c44bba 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -85,7 +85,18 @@ else() endif() if(${PROJECT}_AUDIO STREQUAL "OAL") - find_package(OpenAL REQUIRED) + if(NOT TARGET OpenAL::OpenAL) + if(APPLE) + find_package(OpenAL CONFIG QUIET + PATHS + "/opt/homebrew/opt/openal-soft" + "/usr/local/opt/openal-soft" + ) + endif() + if(NOT TARGET OpenAL::OpenAL) + find_package(OpenAL REQUIRED) + endif() + endif() if(TARGET OpenAL::OpenAL) target_link_libraries(${EXECUTABLE} PRIVATE OpenAL::OpenAL) else() @@ -100,7 +111,9 @@ elseif(${PROJECT}_AUDIO STREQUAL "MSS") target_link_libraries(${EXECUTABLE} PRIVATE MilesSDK::MilesSDK) endif() -find_package(mpg123 REQUIRED) +if(NOT TARGET MPG123::libmpg123) + find_package(mpg123 REQUIRED) +endif() target_link_libraries(${EXECUTABLE} PRIVATE MPG123::libmpg123 ) @@ -224,7 +237,9 @@ if(APPLE AND NOT ANDROID) MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "io.github.mrxenginner.reVC" - XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" + "XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME[sdk=macosx*]" "YES" + "XCODE_ATTRIBUTE_INSTALL_PATH[sdk=macosx*]" "$(LOCAL_APPS_DIR)" + XCODE_ATTRIBUTE_SKIP_INSTALL "NO" ) add_custom_command(TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove_directory From 174c82eca575e4a720424a06eaea477c8084455e Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Mon, 31 Aug 2026 19:25:55 +0400 Subject: [PATCH 19/25] build: remove stale libsndfile linkage --- premake5.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/premake5.lua b/premake5.lua index bf5602159..325dbb597 100644 --- a/premake5.lua +++ b/premake5.lua @@ -482,13 +482,13 @@ project "reVC" libdirs { "vendor/openal-soft/libs/Win64" } filter "platforms:linux*oal" - links { "openal", "mpg123", "sndfile", "pthread" } + links { "openal", "mpg123", "pthread" } filter "platforms:bsd*oal" - links { "openal", "mpg123", "sndfile", "pthread" } + links { "openal", "mpg123", "pthread" } filter "platforms:macosx*oal" - links { "openal", "mpg123", "sndfile", "pthread" } + links { "openal", "mpg123", "pthread" } filter "platforms:macosx-arm64-*oal" dependencyincludedirs { "/opt/homebrew/opt/openal-soft/include" } From 819c2413309b61698fc4e64f4b368b5576d3dc40 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Mon, 31 Aug 2026 20:44:43 +0400 Subject: [PATCH 20/25] build: make the app bundle self-contained --- CMakeLists.txt | 134 +++- premake5.lua | 270 ++++--- res/macos/ThirdPartyNotices.txt | 1319 +++++++++++++++++++++++++++++++ src/CMakeLists.txt | 89 ++- 4 files changed, 1688 insertions(+), 124 deletions(-) create mode 100644 res/macos/ThirdPartyNotices.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ebabb584..6fa3221ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,44 +34,114 @@ include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1 "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR") message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}") -if(APPLE AND CMAKE_GENERATOR STREQUAL "Xcode") - set(${PROJECT}_HOMEBREW_ARM64_PREFIX "/opt/homebrew" CACHE PATH "arm64 Homebrew prefix") - set(${PROJECT}_HOMEBREW_X86_64_PREFIX "/usr/local" CACHE PATH "x86_64 Homebrew prefix") - - function(reVC_macos_homebrew_dependency target alias formula library) - set(include_prefix) - set(link_options) - foreach(architecture arm64 x86_64) - if(architecture IN_LIST CMAKE_OSX_ARCHITECTURES) - string(TOUPPER "${architecture}" architecture_upper) - set(prefix "${${PROJECT}_HOMEBREW_${architecture_upper}_PREFIX}") - if(NOT EXISTS "${prefix}/opt/${formula}/lib/lib${library}.dylib") - message(FATAL_ERROR - "${architecture} ${formula} was not found under ${prefix}" +if(APPLE) + macro(reVC_define_macos_dependency key alias formula library filename) + list(APPEND ${PROJECT}_MACOS_DEPENDENCIES "${key}") + set(${PROJECT}_MACOS_${key}_ALIAS "${alias}") + set(${PROJECT}_MACOS_${key}_FORMULA "${formula}") + set(${PROJECT}_MACOS_${key}_LIBRARY "${library}") + set(${PROJECT}_MACOS_${key}_FILENAME "${filename}") + endmacro() + + reVC_define_macos_dependency(OPENAL OpenAL::OpenAL + openal-soft openal libopenal.1.dylib) + reVC_define_macos_dependency(MPG123 MPG123::libmpg123 + mpg123 mpg123 libmpg123.0.dylib) + reVC_define_macos_dependency(GLFW glfw + glfw glfw libglfw.3.dylib) + + if(CMAKE_GENERATOR STREQUAL "Xcode") + set(${PROJECT}_HOMEBREW_ARM64_PREFIX "/opt/homebrew" CACHE PATH "arm64 Homebrew prefix") + set(${PROJECT}_HOMEBREW_X86_64_PREFIX "/usr/local" CACHE PATH "x86_64 Homebrew prefix") + + function(reVC_macos_dependency target alias dylibs formula library filename) + if(EXISTS "/opt/local/lib/${filename}") + add_library(${target} INTERFACE) + add_library(${alias} ALIAS ${target}) + target_include_directories(${target} INTERFACE "/opt/local/include") + target_link_libraries(${target} INTERFACE "/opt/local/lib/${filename}") + set(${dylibs} "/opt/local/lib/${filename}" PARENT_SCOPE) + return() + endif() + + set(include_prefix) + set(link_options) + set(dependency_dylibs) + foreach(architecture arm64 x86_64) + if(architecture IN_LIST CMAKE_OSX_ARCHITECTURES) + string(TOUPPER "${architecture}" architecture_upper) + set(prefix "${${PROJECT}_HOMEBREW_${architecture_upper}_PREFIX}") + set(dylib "${prefix}/opt/${formula}/lib/${filename}") + if(NOT EXISTS "${dylib}") + message(FATAL_ERROR + "${architecture} ${formula} was not found under ${prefix}" + ) + endif() + if(NOT include_prefix) + set(include_prefix "${prefix}") + endif() + list(APPEND dependency_dylibs "${dylib}") + list(APPEND link_options + "SHELL:-Xarch_${architecture} -L${prefix}/opt/${formula}/lib" ) endif() - if(NOT include_prefix) - set(include_prefix "${prefix}") + endforeach() + + add_library(${target} INTERFACE) + add_library(${alias} ALIAS ${target}) + target_include_directories(${target} INTERFACE + "${include_prefix}/opt/${formula}/include" + ) + target_link_options(${target} INTERFACE ${link_options} "-l${library}") + set(${dylibs} "${dependency_dylibs}" PARENT_SCOPE) + endfunction() + + if("arm64" IN_LIST CMAKE_OSX_ARCHITECTURES OR + "x86_64" IN_LIST CMAKE_OSX_ARCHITECTURES) + foreach(dependency IN LISTS ${PROJECT}_MACOS_DEPENDENCIES) + string(TOLOWER "${dependency}" dependency_lower) + reVC_macos_dependency(${PROJECT}_macos_${dependency_lower} + ${${PROJECT}_MACOS_${dependency}_ALIAS} + ${PROJECT}_MACOS_${dependency}_DYLIBS + ${${PROJECT}_MACOS_${dependency}_FORMULA} + ${${PROJECT}_MACOS_${dependency}_LIBRARY} + ${${PROJECT}_MACOS_${dependency}_FILENAME}) + endforeach() + endif() + else() + function(reVC_macos_dependency_dylib output formula filename) + set(prefix "$ENV{HOMEBREW_PREFIX}") + set(candidates "/opt/local/lib/${filename}") + if(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64" OR + (NOT CMAKE_OSX_ARCHITECTURES AND + CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")) + list(APPEND candidates + "/usr/local/opt/${formula}/lib/${filename}" + ) + else() + if(prefix) + list(APPEND candidates "${prefix}/opt/${formula}/lib/${filename}") endif() - list(APPEND link_options - "SHELL:-Xarch_${architecture} -L${prefix}/opt/${formula}/lib" + list(APPEND candidates + "/opt/homebrew/opt/${formula}/lib/${filename}" + "/usr/local/opt/${formula}/lib/${filename}" ) endif() + list(REMOVE_DUPLICATES candidates) + foreach(candidate IN LISTS candidates) + if(EXISTS "${candidate}") + set(${output} "${candidate}" PARENT_SCOPE) + return() + endif() + endforeach() + endfunction() + + foreach(dependency IN LISTS ${PROJECT}_MACOS_DEPENDENCIES) + reVC_macos_dependency_dylib( + ${PROJECT}_MACOS_${dependency}_DYLIBS + ${${PROJECT}_MACOS_${dependency}_FORMULA} + ${${PROJECT}_MACOS_${dependency}_FILENAME}) endforeach() - - add_library(${target} INTERFACE) - add_library(${alias} ALIAS ${target}) - target_include_directories(${target} INTERFACE - "${include_prefix}/opt/${formula}/include" - ) - target_link_options(${target} INTERFACE ${link_options} "-l${library}") - endfunction() - - if("arm64" IN_LIST CMAKE_OSX_ARCHITECTURES OR - "x86_64" IN_LIST CMAKE_OSX_ARCHITECTURES) - reVC_macos_homebrew_dependency(${PROJECT}_macos_openal OpenAL::OpenAL openal-soft openal) - reVC_macos_homebrew_dependency(${PROJECT}_macos_glfw glfw glfw glfw) - reVC_macos_homebrew_dependency(${PROJECT}_macos_mpg123 MPG123::libmpg123 mpg123 mpg123) endif() endif() diff --git a/premake5.lua b/premake5.lua index 325dbb597..88554200c 100644 --- a/premake5.lua +++ b/premake5.lua @@ -76,6 +76,102 @@ local function dependencyincludedirs(paths) end end +local macosxHomebrewPrefix = os.getenv("HOMEBREW_PREFIX") +if not macosxHomebrewPrefix or macosxHomebrewPrefix == "" then + macosxHomebrewPrefix = os.host() == "macosx" and os.hostarch() == "ARM64" and "/opt/homebrew" or "/usr/local" +end + +local function resolveMacosxDependencyDylib(formula, filename, homebrewPrefix) + local candidates = { + path.join("/opt/local/lib", filename), + path.join(homebrewPrefix, "opt", formula, "lib", filename), + } + + for _, candidate in ipairs(candidates) do + if os.isfile(candidate) then + return candidate + end + end + return candidates[2] +end + +local macosxDependencies = { + { formula = "openal-soft", filename = "libopenal.1.dylib" }, + { formula = "mpg123", filename = "libmpg123.0.dylib" }, + { formula = "glfw", filename = "libglfw.3.dylib" }, +} + +local function resolveMacosxDependencyDylibs(homebrewPrefix) + local dylibs = {} + for _, dependency in ipairs(macosxDependencies) do + table.insert(dylibs, { + filename = dependency.filename, + path = resolveMacosxDependencyDylib(dependency.formula, dependency.filename, homebrewPrefix), + }) + end + return dylibs +end + +local macosxDependencyDylibs = resolveMacosxDependencyDylibs(macosxHomebrewPrefix) +local macosxArm64HomebrewPrefix = os.hostarch() == "ARM64" and macosxHomebrewPrefix or "/opt/homebrew" +local macosxAmd64HomebrewPrefix = os.hostarch() == "ARM64" and "/usr/local" or macosxHomebrewPrefix +local macosxArm64DependencyDylibs = resolveMacosxDependencyDylibs(macosxArm64HomebrewPrefix) +local macosxAmd64DependencyDylibs = resolveMacosxDependencyDylibs(macosxAmd64HomebrewPrefix) + +local macosxXcodeArchitectures = _OPTIONS["arch"] +if not macosxXcodeArchitectures or macosxXcodeArchitectures == "universal" then + macosxXcodeArchitectures = "$(ARCHS_STANDARD)" +end + +local macosxXcodeDeploymentTarget = macosxXcodeArchitectures == "x86_64" and "10.12" or "11.0" +local macosxXcodeBuildSettings = { + ["ARCHS"] = { macosxXcodeArchitectures }, + ["MACOSX_DEPLOYMENT_TARGET"] = { macosxXcodeDeploymentTarget }, + ["ONLY_ACTIVE_ARCH"] = { "YES" }, +} +if macosxXcodeArchitectures == "$(ARCHS_STANDARD)" then + macosxXcodeBuildSettings["MACOSX_DEPLOYMENT_TARGET[arch=x86_64]"] = { "10.12" } +end + +local function macosxDependencyPaths(dylibs) + local paths = {} + for _, dylib in ipairs(dylibs) do + table.insert(paths, dylib.path) + end + return paths +end + +local function macosxDependencyFilenames(dylibs) + local filenames = {} + for _, dylib in ipairs(dylibs) do + table.insert(filenames, dylib.filename) + end + return filenames +end + +local function macosxInstallNameCommands(dylibs, executable) + local commands = {} + for _, dylib in ipairs(dylibs) do + table.insert(commands, 'install_name_tool -change "' .. dylib.path .. '" "@rpath/' .. dylib.filename .. '" "' .. executable .. '"') + end + return commands +end + +local function macosxGmakeBundleCommands(dylibs) + local commands = {} + for _, dylib in ipairs(dylibs) do + table.insert(commands, '{COPYFILE} "' .. dylib.path .. '" "%{cfg.targetdir}/reVC.app/Contents/Frameworks/' .. dylib.filename .. '"') + end + for _, command in ipairs(macosxInstallNameCommands(dylibs, "%{cfg.targetdir}/reVC.app/Contents/MacOS/reVC")) do + table.insert(commands, command) + end + for _, dylib in ipairs(dylibs) do + table.insert(commands, 'codesign --force --sign - "%{cfg.targetdir}/reVC.app/Contents/Frameworks/' .. dylib.filename .. '"') + end + table.insert(commands, 'codesign --force --sign - "%{cfg.targetdir}/reVC.app"') + return commands +end + workspace "reVC" language "C++" configurations { "Debug", "Release" } @@ -118,7 +214,8 @@ workspace "reVC" "bsd-arm64-librw_gl3_glfw-oal" } - filter { "system:macosx" } + filter { "system:macosx" } + cppdialect "gnu++14" if _ACTION == "xcode4" then platforms { "macosx-librw_gl3_glfw-oal" } else @@ -162,32 +259,16 @@ workspace "reVC" filter { "platforms:*arm64*" } architecture "ARM64" - filter { "platforms:macosx-arm64-*", "action:not xcode4", "files:**.cpp"} - buildoptions { "-target", "arm64-apple-macos11", "-std=gnu++14" } - - filter { "platforms:macosx-arm64-*", "action:not xcode4", "files:**.c"} - buildoptions { "-target", "arm64-apple-macos11" } - filter { "platforms:macosx-arm64-*", "action:not xcode4" } + buildoptions { "-target", "arm64-apple-macos11" } linkoptions { "-target", "arm64-apple-macos11" } - filter { "platforms:macosx-amd64-*", "action:not xcode4", "files:**.cpp"} - buildoptions { "-target", "x86_64-apple-macos10.12", "-std=gnu++14" } - - filter { "platforms:macosx-amd64-*", "action:not xcode4", "files:**.c"} - buildoptions { "-target", "x86_64-apple-macos10.12" } - filter { "platforms:macosx-amd64-*", "action:not xcode4" } + buildoptions { "-target", "x86_64-apple-macos10.12" } linkoptions { "-target", "x86_64-apple-macos10.12" } - filter { "action:xcode4" } - cppdialect "gnu++14" - xcodebuildsettings { - ["ARCHS"] = { "$(ARCHS_STANDARD)" }, - ["MACOSX_DEPLOYMENT_TARGET[arch=arm64]"] = { "11.0" }, - ["MACOSX_DEPLOYMENT_TARGET[arch=x86_64]"] = { "10.12" }, - ["ONLY_ACTIVE_ARCH"] = { "YES" }, - } + filter { "system:macosx", "action:xcode4" } + xcodebuildsettings(macosxXcodeBuildSettings) filter { "platforms:*librw_d3d9*" } defines { "RW_D3D9" } @@ -225,20 +306,19 @@ workspace "reVC" end if(_OPTIONS["with-librw"]) then -project "librw" - kind "StaticLib" - targetname "rw" - filter "action:not xcode4" - targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) - filter "action:xcode4" +project "librw" + kind "StaticLib" + targetname "rw" + if _ACTION == "xcode4" then targetdir "${BUILD_DIR}/%{cfg.buildcfg}" xcodebuildsettings { ["SKIP_INSTALL"] = "YES", } + else + targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}")) + end - filter {} - - files { path.join(Librw, "src/*.*") } + files { path.join(Librw, "src/*.*") } files { path.join(Librw, "src/*/*.*") } files { path.join(Librw, "src/gl/*/*.*") } @@ -257,23 +337,17 @@ project "librw" includedirs { "/usr/local/include" } libdirs { "/usr/local/lib" } - -- Support MacPorts and Homebrew - filter "platforms:macosx-arm64-*" - dependencyincludedirs { "/opt/local/include" } - dependencyincludedirs { "/opt/homebrew/include" } - libdirs { "/opt/local/lib" } - libdirs { "/opt/homebrew/lib" } - - filter "platforms:macosx-amd64-*" - dependencyincludedirs { "/opt/local/include" } - dependencyincludedirs { "/usr/local/include" } - libdirs { "/opt/local/lib" } - libdirs { "/usr/local/lib" } + -- Support MacPorts and Homebrew + filter "platforms:macosx-arm64-*" + dependencyincludedirs { "/opt/local/include", "/opt/homebrew/include" } + libdirs { "/opt/local/lib", "/opt/homebrew/lib" } + + filter "platforms:macosx-amd64-*" + dependencyincludedirs { "/opt/local/include", "/usr/local/include" } + libdirs { "/opt/local/lib", "/usr/local/lib" } filter { "system:macosx", "action:xcode4" } - dependencyincludedirs { "/opt/local/include" } - dependencyincludedirs { "/opt/homebrew/include" } - dependencyincludedirs { "/usr/local/include" } + dependencyincludedirs { "/opt/local/include", "/opt/homebrew/include", "/usr/local/include" } xcodebuildsettings { ["LIBRARY_SEARCH_PATHS[arch=arm64]"] = { "$(inherited)", "/opt/local/lib", "/opt/homebrew/lib" }, ["LIBRARY_SEARCH_PATHS[arch=x86_64]"] = { "$(inherited)", "/opt/local/lib", "/usr/local/lib" }, @@ -291,42 +365,62 @@ local function addSrcFiles( prefix ) return prefix .. "/*cpp", prefix .. "/*.h", prefix .. "/*.c", prefix .. "/*.ico", prefix .. "/*.rc" end -project "reVC" - kind "WindowedApp" - targetname "reVC" - filter "action:not xcode4" - targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" - filter "action:xcode4" +project "reVC" + kind "WindowedApp" + targetname "reVC" + if _ACTION == "xcode4" then targetdir "${BUILD_DIR}/%{cfg.buildcfg}" + else + targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + end - filter {} - filter { "system:macosx" } - files { "res/images/reVC.icns", "res/macos/Info.plist" } + files { "res/images/reVC.icns", "res/macos/Info.plist", "res/macos/ThirdPartyNotices.txt" } filter { "system:macosx", "action:xcode4" } + xcodebuildresources { "res/macos/ThirdPartyNotices.txt" } xcodebuildsettings { ["PRODUCT_BUNDLE_IDENTIFIER"] = "io.github.mrxenginner.reVC", ["INSTALL_PATH"] = "$(LOCAL_APPS_DIR)", - ["ENABLE_HARDENED_RUNTIME"] = "YES", + ["CODE_SIGN_STYLE"] = "Automatic", + ["LD_RUNPATH_SEARCH_PATHS"] = "$(inherited) @executable_path/../Frameworks", } + links(macosxDependencyPaths(macosxDependencyDylibs)) + links { "pthread" } + embedAndSign(macosxDependencyFilenames(macosxDependencyDylibs)) postbuildcommands { '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', '{RMDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources/gamefiles"', '{COPYDIR} "%{prj.location}/../gamefiles" "%{cfg.targetdir}/reVC.app/Contents/Resources"', } + postbuildcommands(macosxInstallNameCommands(macosxDependencyDylibs, "${TARGET_BUILD_DIR}/${EXECUTABLE_PATH}")) + + filter { "system:macosx", "action:xcode4", "configurations:Release" } + xcodebuildsettings { + ["CODE_SIGN_IDENTITY"] = "Apple Development", + ["ENABLE_HARDENED_RUNTIME"] = "YES", + } filter { "system:macosx", "action:gmake*" } + linkoptions { "-Wl,-rpath,@executable_path/../Frameworks" } postbuildcommands { '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/MacOS"', + '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Frameworks"', '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', '{COPYFILE} "%{cfg.buildtarget.abspath}" "%{cfg.targetdir}/reVC.app/Contents/MacOS/reVC"', '{COPYFILE} "%{prj.location}/../res/images/reVC.icns" "%{cfg.targetdir}/reVC.app/Contents/Resources/reVC.icns"', + '{COPYFILE} "%{prj.location}/../res/macos/ThirdPartyNotices.txt" "%{cfg.targetdir}/reVC.app/Contents/Resources/ThirdPartyNotices.txt"', '{COPYFILE} "%{prj.location}/../res/macos/Info.plist" "%{cfg.targetdir}/reVC.app/Contents/Info.plist"', '{RMDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources/gamefiles"', '{COPYDIR} "%{prj.location}/../gamefiles" "%{cfg.targetdir}/reVC.app/Contents/Resources"', } + filter { "action:gmake*", "platforms:macosx-arm64-*" } + postbuildcommands(macosxGmakeBundleCommands(macosxArm64DependencyDylibs)) + + filter { "action:gmake*", "platforms:macosx-amd64-*" } + postbuildcommands(macosxGmakeBundleCommands(macosxAmd64DependencyDylibs)) + filter {} if(_OPTIONS["with-librw"]) then @@ -487,18 +581,18 @@ project "reVC" filter "platforms:bsd*oal" links { "openal", "mpg123", "pthread" } - filter "platforms:macosx*oal" - links { "openal", "mpg123", "pthread" } - - filter "platforms:macosx-arm64-*oal" + filter { "platforms:macosx*oal", "action:not xcode4" } + links { "openal", "mpg123", "pthread" } + + filter "platforms:macosx-arm64-*oal" dependencyincludedirs { "/opt/homebrew/opt/openal-soft/include" } - libdirs { "/opt/homebrew/opt/openal-soft/lib" } + libdirs { "/opt/homebrew/opt/openal-soft/lib" } - filter "platforms:macosx-amd64-*oal" + filter "platforms:macosx-amd64-*oal" dependencyincludedirs { "/usr/local/opt/openal-soft/include" } - libdirs { "/usr/local/opt/openal-soft/lib" } - - if _OPTIONS["with-opus"] then + libdirs { "/usr/local/opt/openal-soft/lib" } + + if _OPTIONS["with-opus"] then filter {} links { "libogg" } links { "opus" } @@ -519,10 +613,10 @@ project "reVC" includedirs { Librw } if(_OPTIONS["with-librw"] and _ACTION ~= "xcode4") then libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" } - end - links { "rw" } - - filter "platforms:*d3d9*" + end + links { "rw" } + + filter "platforms:*d3d9*" defines { "USE_D3D9" } links { "d3d9" } @@ -546,29 +640,27 @@ project "reVC" includedirs { "/usr/local/include" } libdirs { "/usr/local/lib" } - filter "platforms:macosx-arm64-*gl3_glfw*" - links { "glfw" } - linkoptions { "-framework OpenGL" } - dependencyincludedirs { "/opt/local/include" } - dependencyincludedirs { "/opt/homebrew/include" } - libdirs { "/opt/local/lib" } - libdirs { "/opt/homebrew/lib" } - - filter "platforms:macosx-amd64-*gl3_glfw*" - links { "glfw" } - linkoptions { "-framework OpenGL" } - dependencyincludedirs { "/opt/local/include" } - dependencyincludedirs { "/usr/local/include" } - libdirs { "/opt/local/lib" } - libdirs { "/usr/local/lib" } + filter { "platforms:macosx*gl3_glfw*", "action:not xcode4" } + links { "glfw" } + linkoptions { "-framework OpenGL" } + + filter "platforms:macosx-arm64-*gl3_glfw*" + dependencyincludedirs { "/opt/local/include", "/opt/homebrew/include" } + libdirs { "/opt/local/lib", "/opt/homebrew/lib" } + + filter "platforms:macosx-amd64-*gl3_glfw*" + dependencyincludedirs { "/opt/local/include", "/usr/local/include" } + libdirs { "/opt/local/lib", "/usr/local/lib" } filter { "system:macosx", "action:xcode4" } - links { "glfw", "OpenGL.framework" } - dependencyincludedirs { "/opt/local/include" } - dependencyincludedirs { "/opt/homebrew/include" } - dependencyincludedirs { "/usr/local/include" } - dependencyincludedirs { "/opt/homebrew/opt/openal-soft/include" } - dependencyincludedirs { "/usr/local/opt/openal-soft/include" } + links { "OpenGL.framework" } + dependencyincludedirs { + "/opt/local/include", + "/opt/homebrew/include", + "/usr/local/include", + "/opt/homebrew/opt/openal-soft/include", + "/usr/local/opt/openal-soft/include", + } xcodebuildsettings { ["LIBRARY_SEARCH_PATHS[arch=arm64]"] = { "$(inherited)", "/opt/local/lib", "/opt/homebrew/lib", "/opt/homebrew/opt/openal-soft/lib" }, ["LIBRARY_SEARCH_PATHS[arch=x86_64]"] = { "$(inherited)", "/opt/local/lib", "/usr/local/lib", "/usr/local/opt/openal-soft/lib" }, diff --git a/res/macos/ThirdPartyNotices.txt b/res/macos/ThirdPartyNotices.txt new file mode 100644 index 000000000..49a4d1292 --- /dev/null +++ b/res/macos/ThirdPartyNotices.txt @@ -0,0 +1,1319 @@ +Third-party software bundled with reVC for macOS + +OpenAL Soft +Source: https://github.com/kcat/openal-soft +License: GNU Library General Public License 2.0 or later + +mpg123 +Copyright (c) 1995-2020 by Michael Hipp and others +Source: https://www.mpg123.de/ +License: GNU Lesser General Public License 2.1 only + +GLFW +Copyright (c) 2002-2006 Marcus Geelnard +Copyright (c) 2006-2019 Camilla Löwy +Source: https://github.com/glfw/glfw +License: zlib License + +OpenAL Soft also incorporates {fmt} and Microsoft GSL code under the +license notices reproduced below. + +======================================================================== +OpenAL Soft license +======================================================================== + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + +======================================================================== +mpg123 notice and license +======================================================================== +This is the file that contains the terms of use, copying, etc. for the mpg123 distribution package. + +Main message, to include in "About ..." boxes, etc: + + Copyright (c) 1995-2020 by Michael Hipp and others, + free software under the terms of the LGPL v2.1 + +There is an attempt to cover the actual list of authors in the AUTHORS file. +Project maintainer since 2006 is Thomas Orgis and many people have contributed +since the Michael Hipp era, but he stays the initial source and it would +be impractical to count them all individually, so it's "and others". +Source files contain the phrase "the mpg123 project" to the same effect +in their license boilerplate; especially those that were added after +maintainership changed. The person mainly responsible for the first version +is usually named in the phrase "initially written by ...". + +All files in the distribution that don't carry a license note on their own are +licensed under the terms of the LGPL 2.1; exceptions may apply, especially to +files not in the official distribution but in the revision control repository. + +The formal license text follows. + +======================= +1. The LGPL version 2.1 +======================= + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + +==================== +2. The GPL version 2 +==================== + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + +======================================================================== +GLFW license +======================================================================== +Copyright (c) 2002-2006 Marcus Geelnard + +Copyright (c) 2006-2019 Camilla Löwy + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would + be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution. + + +======================================================================== +{fmt} license (incorporated by OpenAL Soft) +======================================================================== +Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + +======================================================================== +Microsoft GSL license (incorporated by OpenAL Soft) +======================================================================== +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +This code is licensed under the MIT License (MIT). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 745c44bba..625e20ef2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -229,15 +229,27 @@ set_target_properties(${EXECUTABLE} if(APPLE AND NOT ANDROID) set(${PROJECT}_MACOS_ICON "${PROJECT_SOURCE_DIR}/res/images/reVC.icns") - target_sources(${EXECUTABLE} PRIVATE "${${PROJECT}_MACOS_ICON}") - set_source_files_properties("${${PROJECT}_MACOS_ICON}" PROPERTIES + set(${PROJECT}_MACOS_NOTICES "${PROJECT_SOURCE_DIR}/res/macos/ThirdPartyNotices.txt") + target_sources(${EXECUTABLE} PRIVATE + "${${PROJECT}_MACOS_ICON}" + "${${PROJECT}_MACOS_NOTICES}" + ) + set_source_files_properties( + "${${PROJECT}_MACOS_ICON}" + "${${PROJECT}_MACOS_NOTICES}" + PROPERTIES MACOSX_PACKAGE_LOCATION "Resources" ) set_target_properties(${EXECUTABLE} PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/res/macos/Info.plist" + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "@executable_path/../Frameworks" + INSTALL_RPATH_USE_LINK_PATH FALSE XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "io.github.mrxenginner.reVC" - "XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME[sdk=macosx*]" "YES" + XCODE_ATTRIBUTE_CODE_SIGN_STYLE "$<$:Automatic>" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "$<$:Apple Development>" + "XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME[sdk=macosx*]" "$,NO,YES>" "XCODE_ATTRIBUTE_INSTALL_PATH[sdk=macosx*]" "$(LOCAL_APPS_DIR)" XCODE_ATTRIBUTE_SKIP_INSTALL "NO" ) @@ -249,12 +261,83 @@ if(APPLE AND NOT ANDROID) "$/Resources/gamefiles" COMMENT "Copying gamefiles into the app bundle" ) + + set(macos_dependency_dylibs_available TRUE) + foreach(dependency IN LISTS ${PROJECT}_MACOS_DEPENDENCIES) + if(NOT DEFINED ${PROJECT}_MACOS_${dependency}_DYLIBS) + set(macos_dependency_dylibs_available FALSE) + break() + endif() + endforeach() + if(macos_dependency_dylibs_available) + set(shell_dollar "$") + set(codesign_command + "identity=${shell_dollar}EXPANDED_CODE_SIGN_IDENTITY; test -n \"${shell_dollar}identity\" || identity=-; /usr/bin/codesign --force --sign \"${shell_dollar}identity\" \"${shell_dollar}1\"" + ) + set(app_codesign_command + "identity=${shell_dollar}EXPANDED_CODE_SIGN_IDENTITY; test -n \"${shell_dollar}identity\" || identity=-; if test \"${shell_dollar}2\" = YES; then /usr/bin/codesign --force --sign \"${shell_dollar}identity\" --options runtime \"${shell_dollar}1\"; else /usr/bin/codesign --force --sign \"${shell_dollar}identity\" \"${shell_dollar}1\"; fi" + ) + if(CMAKE_GENERATOR STREQUAL "Xcode") + set(app_hardened "$,NO,YES>") + else() + set(app_hardened NO) + endif() + add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + "$/Frameworks" + ) + + function(reVC_bundle_macos_dylib target filename) + set(destination + "$/Frameworks/${filename}" + ) + list(LENGTH ARGN source_count) + if(source_count GREATER 1) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND /usr/bin/lipo -create ${ARGN} -output "${destination}" + ) + else() + list(GET ARGN 0 source) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${source}" "${destination}" + ) + endif() + foreach(source IN LISTS ARGN) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND install_name_tool -change + "${source}" "@rpath/${filename}" "$" + ) + endforeach() + add_custom_command(TARGET ${target} POST_BUILD + COMMAND /bin/sh -c + "${codesign_command}" + codesign "${destination}" + VERBATIM + ) + endfunction() + + foreach(dependency IN LISTS ${PROJECT}_MACOS_DEPENDENCIES) + reVC_bundle_macos_dylib(${EXECUTABLE} + ${${PROJECT}_MACOS_${dependency}_FILENAME} + ${${PROJECT}_MACOS_${dependency}_DYLIBS}) + endforeach() + add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND /bin/sh -c + "${app_codesign_command}" + codesign "$" + "${app_hardened}" + COMMENT "Bundling macOS dependencies" + VERBATIM + ) + endif() endif() if(${PROJECT}_INSTALL) install( TARGETS ${EXECUTABLE} EXPORT ${EXECUTABLE}-targets + BUNDLE DESTINATION "." RUNTIME DESTINATION "." ) if(MSVC) From da255edf34c8fb01cb3c7b3a44d662623c4b2875 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Tue, 1 Sep 2026 01:59:17 +0400 Subject: [PATCH 21/25] fix: prevent buffer overflow with long game directory paths --- src/audio/oal/stream.h | 3 ++- src/skel/crossplatform.h | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/audio/oal/stream.h b/src/audio/oal/stream.h index d472c603f..522d13d41 100644 --- a/src/audio/oal/stream.h +++ b/src/audio/oal/stream.h @@ -3,6 +3,7 @@ #ifdef AUDIO_OAL #include +#include "crossplatform.h" #define NUM_STREAMBUFFERS 8 @@ -116,7 +117,7 @@ template class tsQueue #endif class CStream { - char m_aFilename[128]; + char m_aFilename[MAX_PATH]; ALuint *m_pAlSources; ALuint (&m_alBuffers)[NUM_STREAMBUFFERS]; diff --git a/src/skel/crossplatform.h b/src/skel/crossplatform.h index 797dd5a5c..8b617b598 100644 --- a/src/skel/crossplatform.h +++ b/src/skel/crossplatform.h @@ -1,3 +1,6 @@ +#ifndef __GTA_CROSSPLATFORM_H__ +#define __GTA_CROSSPLATFORM_H__ + #ifndef GTA_PS2 #include @@ -203,3 +206,5 @@ void GetDateFormat(int, int, SYSTEMTIME*, int, char*, int); #endif #endif + +#endif // __GTA_CROSSPLATFORM_H__ From e601184915114f9394bb36124cfc359d96f2a606 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Tue, 1 Sep 2026 02:04:10 +0400 Subject: [PATCH 22/25] chore: add application category to Info.plist --- res/macos/Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/macos/Info.plist b/res/macos/Info.plist index 635165fbb..4a6d99c20 100644 --- a/res/macos/Info.plist +++ b/res/macos/Info.plist @@ -31,5 +31,7 @@ NSHighResolutionCapable + LSApplicationCategoryType + public.app-category.games From d37e3eb1be97afbfda9d22115089649f9d042877 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Tue, 1 Sep 2026 13:58:49 +0400 Subject: [PATCH 23/25] fix: omit missing Homebrew OpenAL search paths when using MacPorts --- premake5.lua | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/premake5.lua b/premake5.lua index 88554200c..652db3fcf 100644 --- a/premake5.lua +++ b/premake5.lua @@ -118,6 +118,22 @@ local macosxAmd64HomebrewPrefix = os.hostarch() == "ARM64" and "/usr/local" or m local macosxArm64DependencyDylibs = resolveMacosxDependencyDylibs(macosxArm64HomebrewPrefix) local macosxAmd64DependencyDylibs = resolveMacosxDependencyDylibs(macosxAmd64HomebrewPrefix) +local function existingDirectories(directories) + local existing = {} + for _, directory in ipairs(directories) do + if os.isdir(directory) then + table.insert(existing, directory) + end + end + return existing +end + +local function existingXcodeSearchPaths(directories) + local existing = existingDirectories(directories) + table.insert(existing, 1, "$(inherited)") + return existing +end + local macosxXcodeArchitectures = _OPTIONS["arch"] if not macosxXcodeArchitectures or macosxXcodeArchitectures == "universal" then macosxXcodeArchitectures = "$(ARCHS_STANDARD)" @@ -585,12 +601,12 @@ project "reVC" links { "openal", "mpg123", "pthread" } filter "platforms:macosx-arm64-*oal" - dependencyincludedirs { "/opt/homebrew/opt/openal-soft/include" } - libdirs { "/opt/homebrew/opt/openal-soft/lib" } + dependencyincludedirs(existingDirectories { "/opt/homebrew/opt/openal-soft/include" }) + libdirs(existingDirectories { "/opt/homebrew/opt/openal-soft/lib" }) filter "platforms:macosx-amd64-*oal" - dependencyincludedirs { "/usr/local/opt/openal-soft/include" } - libdirs { "/usr/local/opt/openal-soft/lib" } + dependencyincludedirs(existingDirectories { "/usr/local/opt/openal-soft/include" }) + libdirs(existingDirectories { "/usr/local/opt/openal-soft/lib" }) if _OPTIONS["with-opus"] then filter {} @@ -654,14 +670,14 @@ project "reVC" filter { "system:macosx", "action:xcode4" } links { "OpenGL.framework" } - dependencyincludedirs { + dependencyincludedirs(existingDirectories { "/opt/local/include", "/opt/homebrew/include", "/usr/local/include", "/opt/homebrew/opt/openal-soft/include", "/usr/local/opt/openal-soft/include", - } + }) xcodebuildsettings { - ["LIBRARY_SEARCH_PATHS[arch=arm64]"] = { "$(inherited)", "/opt/local/lib", "/opt/homebrew/lib", "/opt/homebrew/opt/openal-soft/lib" }, - ["LIBRARY_SEARCH_PATHS[arch=x86_64]"] = { "$(inherited)", "/opt/local/lib", "/usr/local/lib", "/usr/local/opt/openal-soft/lib" }, + ["LIBRARY_SEARCH_PATHS[arch=arm64]"] = existingXcodeSearchPaths { "/opt/local/lib", "/opt/homebrew/lib", "/opt/homebrew/opt/openal-soft/lib" }, + ["LIBRARY_SEARCH_PATHS[arch=x86_64]"] = existingXcodeSearchPaths { "/opt/local/lib", "/usr/local/lib", "/usr/local/opt/openal-soft/lib" }, } From 84ad0e683dcb6f40a12c33941090ab7a21fb428d Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Tue, 1 Sep 2026 14:04:28 +0400 Subject: [PATCH 24/25] refactor: move game path declarations to FileMgr header --- src/core/FileMgr.cpp | 1 - src/core/FileMgr.h | 5 +++++ src/core/main.h | 4 ---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index 3ba8ce9fd..7eaeb32fc 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -11,7 +11,6 @@ #include "crossplatform.h" #include "FileMgr.h" -#include "main.h" const char *_psGetUserFilesFolder(); diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h index 0f813400e..745b44b1d 100644 --- a/src/core/FileMgr.h +++ b/src/core/FileMgr.h @@ -26,4 +26,9 @@ class CFileMgr static char *GetRootDirName() { return ms_rootDirName; } }; +#ifdef __APPLE__ +bool ReadGamePathFromINI(char *path, size_t pathSize); +void WriteGamePathToINI(const char *path); +#endif + #endif // __GTA_FILEMGR_H__ diff --git a/src/core/main.h b/src/core/main.h index 1471ff90a..28fa9cc54 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -61,10 +61,6 @@ bool LoadINISettings(); void SaveINISettings(); void LoadINIControllerSettings(); void SaveINIControllerSettings(); -#ifdef __APPLE__ -bool ReadGamePathFromINI(char *path, size_t pathSize); -void WriteGamePathToINI(const char *path); -#endif #endif #ifdef NEW_RENDERER From d8cb257766af3b784ab8f4670af9aae130513a64 Mon Sep 17 00:00:00 2001 From: Elnur Hajiyev Date: Tue, 1 Sep 2026 15:26:23 +0400 Subject: [PATCH 25/25] build: include the LICENSE file in the app bundle --- premake5.lua | 2 ++ src/CMakeLists.txt | 3 +++ 2 files changed, 5 insertions(+) diff --git a/premake5.lua b/premake5.lua index 652db3fcf..69426532f 100644 --- a/premake5.lua +++ b/premake5.lua @@ -406,6 +406,7 @@ project "reVC" embedAndSign(macosxDependencyFilenames(macosxDependencyDylibs)) postbuildcommands { '{MKDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources"', + '{COPYFILE} "%{prj.location}/../LICENSE.md" "%{cfg.targetdir}/reVC.app/Contents/Resources/LICENSE"', '{RMDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources/gamefiles"', '{COPYDIR} "%{prj.location}/../gamefiles" "%{cfg.targetdir}/reVC.app/Contents/Resources"', } @@ -426,6 +427,7 @@ project "reVC" '{COPYFILE} "%{cfg.buildtarget.abspath}" "%{cfg.targetdir}/reVC.app/Contents/MacOS/reVC"', '{COPYFILE} "%{prj.location}/../res/images/reVC.icns" "%{cfg.targetdir}/reVC.app/Contents/Resources/reVC.icns"', '{COPYFILE} "%{prj.location}/../res/macos/ThirdPartyNotices.txt" "%{cfg.targetdir}/reVC.app/Contents/Resources/ThirdPartyNotices.txt"', + '{COPYFILE} "%{prj.location}/../LICENSE.md" "%{cfg.targetdir}/reVC.app/Contents/Resources/LICENSE"', '{COPYFILE} "%{prj.location}/../res/macos/Info.plist" "%{cfg.targetdir}/reVC.app/Contents/Info.plist"', '{RMDIR} "%{cfg.targetdir}/reVC.app/Contents/Resources/gamefiles"', '{COPYDIR} "%{prj.location}/../gamefiles" "%{cfg.targetdir}/reVC.app/Contents/Resources"', diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 625e20ef2..39174f63f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -254,6 +254,9 @@ if(APPLE AND NOT ANDROID) XCODE_ATTRIBUTE_SKIP_INSTALL "NO" ) add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${PROJECT_SOURCE_DIR}/LICENSE.md" + "$/Resources/LICENSE" COMMAND ${CMAKE_COMMAND} -E remove_directory "$/Resources/gamefiles" COMMAND ${CMAKE_COMMAND} -E copy_directory