From f2ae1a25457ea679f2964a5d3d351d0a1e58750b Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Sat, 7 Nov 2015 10:50:47 -0800 Subject: [PATCH] Implement relocatable builds on Linux - Change the path of the Sys folder to the executable's location - Add LINUX_LOCAL_DEV flag to use relocatable version on Linux - Add CMake definition for relocatable build --- CMakeLists.txt | 6 ++++++ Source/Core/Common/CommonPaths.h | 2 +- Source/Core/Common/FileUtil.cpp | 16 +++++++++++++--- Source/Core/Common/FileUtil.h | 2 -- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 853f206cd3..c3f7b12354 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,6 +312,12 @@ if(WIN32) add_definitions(-D_CRT_SECURE_NO_DEPRECATE) endif(WIN32) +# Add an option to build relocatable binaries on Linux +# The Sys folder will need to be copied to the Binaries folder. +if(UNIX) + add_definitions(-DLINUX_LOCAL_DEV=0) +endif(UNIX) + # Dolphin requires threads. # The Apple build may not need an explicit flag because one of the # frameworks may already provide it. diff --git a/Source/Core/Common/CommonPaths.h b/Source/Core/Common/CommonPaths.h index 41cb65c24c..5d81bd29e7 100644 --- a/Source/Core/Common/CommonPaths.h +++ b/Source/Core/Common/CommonPaths.h @@ -32,7 +32,7 @@ #endif // Shared data dirs (Sys and shared User for Linux) -#ifdef _WIN32 +#if defined(_WIN32) || defined(LINUX_LOCAL_DEV) #define SYSDATA_DIR "Sys" #elif defined __APPLE__ #define SYSDATA_DIR "Contents/Resources/Sys" diff --git a/Source/Core/Common/FileUtil.cpp b/Source/Core/Common/FileUtil.cpp index 84961d54ad..585b0c5cc1 100644 --- a/Source/Core/Common/FileUtil.cpp +++ b/Source/Core/Common/FileUtil.cpp @@ -728,12 +728,12 @@ std::string GetBundleDirectory() } #endif -#ifdef _WIN32 std::string& GetExeDirectory() { static std::string DolphinPath; if (DolphinPath.empty()) { +#ifdef _WIN32 TCHAR Dolphin_exe_Path[2048]; TCHAR Dolphin_exe_Clean_Path[MAX_PATH]; GetModuleFileName(nullptr, Dolphin_exe_Path, 2048); @@ -742,10 +742,20 @@ std::string& GetExeDirectory() else DolphinPath = TStrToUTF8(Dolphin_exe_Path); DolphinPath = DolphinPath.substr(0, DolphinPath.find_last_of('\\')); +#else + char Dolphin_exe_Path[PATH_MAX]; + ssize_t len = ::readlink("/proc/self/exe", Dolphin_exe_Path, sizeof(Dolphin_exe_Path)); + if (len == -1 || len == sizeof(Dolphin_exe_Path)) + { + len = 0; + } + Dolphin_exe_Path[len] = '\0'; + DolphinPath = Dolphin_exe_Path; + DolphinPath = DolphinPath.substr(0, DolphinPath.rfind('/')); +#endif } return DolphinPath; } -#endif std::string GetSysDirectory() { @@ -753,7 +763,7 @@ std::string GetSysDirectory() #if defined (__APPLE__) sysDir = GetBundleDirectory() + DIR_SEP + SYSDATA_DIR; -#elif defined (_WIN32) +#elif defined (_WIN32) || defined (LINUX_LOCAL_DEV) sysDir = GetExeDirectory() + DIR_SEP + SYSDATA_DIR; #else sysDir = SYSDATA_DIR; diff --git a/Source/Core/Common/FileUtil.h b/Source/Core/Common/FileUtil.h index fefbed193d..0736d7c88f 100644 --- a/Source/Core/Common/FileUtil.h +++ b/Source/Core/Common/FileUtil.h @@ -145,9 +145,7 @@ std::string GetSysDirectory(); std::string GetBundleDirectory(); #endif -#ifdef _WIN32 std::string &GetExeDirectory(); -#endif bool WriteStringToFile(const std::string& str, const std::string& filename); bool ReadFileToString(const std::string& filename, std::string& str);