Make all relative paths use base dir

modernize-cmake-1
MrSimbax 2020-04-05 13:24:45 +02:00
parent 3fbfadb0d4
commit 621453a01c
7 changed files with 50 additions and 43 deletions

View File

@ -230,7 +230,10 @@ option(DEV_BUILD "Enable development build (enables some debugging tools, local
# PLEASE DO NOT USE ON UNOFFICIAL BUILDS. Thanks. # PLEASE DO NOT USE ON UNOFFICIAL BUILDS. Thanks.
option(OFFICIAL_COLOBOT_BUILD "Official build (changes crash screen text)" OFF) option(OFFICIAL_COLOBOT_BUILD "Official build (changes crash screen text)" OFF)
# Portable build - load all data from current directory # Hardcode relative paths instead of absolute paths
option(USE_RELATIVE_PATHS "Generate relative paths from absolute paths" OFF)
# Portable build - load all data from the base directory
option(PORTABLE "Portable build" OFF) option(PORTABLE "Portable build" OFF)
# Portable saves - suitable for e.g. putting the whole game on external storage and moving your saves with it # Portable saves - suitable for e.g. putting the whole game on external storage and moving your saves with it
@ -392,39 +395,44 @@ endif()
# Installation paths defined before compiling sources # Installation paths defined before compiling sources
if(PORTABLE OR (PLATFORM_WINDOWS AND MXE)) if(PORTABLE OR (PLATFORM_WINDOWS AND MXE))
# We need to use STRING because PATH doesn't accept relative paths # We need to use STRING because PATH doesn't accept relative paths
set(COLOBOT_INSTALL_BIN_DIR ./ CACHE STRING "Colobot binary directory") set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE STRING "Colobot binary directory")
set(COLOBOT_INSTALL_LIB_DIR ./ CACHE STRING "Colobot libraries directory") set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE STRING "Colobot libraries directory")
set(COLOBOT_RELATIVE_DATA_DIR data CACHE STRING "Colobot shared data directory (relative)") set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/data CACHE STRING "Colobot shared data directory")
set(COLOBOT_RELATIVE_I18N_DIR lang CACHE STRING "Colobot translations directory (relative)") set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/lang CACHE STRING "Colobot translations directory")
set(COLOBOT_INSTALL_DATA_DIR ./data CACHE STRING "Colobot shared data directory") set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE STRING "Colobot documentation directory")
set(COLOBOT_INSTALL_I18N_DIR ./lang CACHE STRING "Colobot translations directory") set(USE_RELATIVE_PATHS ON)
set(COLOBOT_INSTALL_DOC_DIR ./doc CACHE STRING "Colobot documentation directory")
elseif(PLATFORM_WINDOWS) elseif(PLATFORM_WINDOWS)
set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot binary directory") set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot binary directory")
set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot libraries directory") set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot libraries directory")
set(COLOBOT_RELATIVE_DATA_DIR data CACHE STRING "Colobot shared data directory (relative)")
set(COLOBOT_RELATIVE_I18N_DIR lang CACHE STRING "Colobot translations directory (relative)")
set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/data CACHE PATH "Colobot shared data directory") set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/data CACHE PATH "Colobot shared data directory")
set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/lang CACHE PATH "Colobot translations directory") set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/lang CACHE PATH "Colobot translations directory")
set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE PATH "Colobot documentation directory") set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE PATH "Colobot documentation directory")
elseif(PLATFORM_MACOSX) elseif(PLATFORM_MACOSX)
set(COLOBOT_INSTALL_BIN_DIR ../MacOS CACHE STRING "Colobot binary directory") set(COLOBOT_INSTALL_BIN_DIR ../MacOS CACHE STRING "Colobot binary directory")
set(COLOBOT_INSTALL_LIB_DIR ../MacOS CACHE STRING "Colobot libraries directory") set(COLOBOT_INSTALL_LIB_DIR ../MacOS CACHE STRING "Colobot libraries directory")
set(COLOBOT_RELATIVE_DATA_DIR . CACHE STRING "Colobot shared data directory (relative)")
set(COLOBOT_RELATIVE_I18N_DIR i18n CACHE STRING "Colobot translations directory (relative)")
set(COLOBOT_INSTALL_DATA_DIR . CACHE STRING "Colobot shared data directory") set(COLOBOT_INSTALL_DATA_DIR . CACHE STRING "Colobot shared data directory")
set(COLOBOT_INSTALL_I18N_DIR i18n CACHE SRING "Colobot translations directory") set(COLOBOT_INSTALL_I18N_DIR i18n CACHE SRING "Colobot translations directory")
set(COLOBOT_INSTALL_DOC_DIR doc CACHE STRING "Colobot documentation directory") set(COLOBOT_INSTALL_DOC_DIR doc CACHE STRING "Colobot documentation directory")
else() else()
set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Colobot binary directory") set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Colobot binary directory")
set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/colobot CACHE PATH "Colobot libraries directory") set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/colobot CACHE PATH "Colobot libraries directory")
set(COLOBOT_RELATIVE_DATA_DIR ../share/games/colobot CACHE STRING "Colobot shared data directory (relative)")
set(COLOBOT_RELATIVE_I18N_DIR ../share/locale CACHE STRING "Colobot translations directory (relative)")
set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/games/colobot CACHE PATH "Colobot shared data directory") set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/games/colobot CACHE PATH "Colobot shared data directory")
set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/share/locale CACHE PATH "Colobot translations directory") set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/share/locale CACHE PATH "Colobot translations directory")
set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/share/doc/colobot CACHE PATH "Colobot documentation directory") set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/share/doc/colobot CACHE PATH "Colobot documentation directory")
endif() endif()
# Generate relative paths from absolute paths
if(USE_RELATIVE_PATHS)
message(STATUS "Generating relative paths")
file(RELATIVE_PATH COLOBOT_DATA_DIR ${COLOBOT_INSTALL_BIN_DIR} ${COLOBOT_INSTALL_DATA_DIR})
file(RELATIVE_PATH COLOBOT_I18N_DIR ${COLOBOT_INSTALL_BIN_DIR} ${COLOBOT_INSTALL_I18N_DIR})
add_definitions(-DUSE_RELATIVE_PATHS)
else()
set(COLOBOT_DATA_DIR ${COLOBOT_INSTALL_DATA_DIR})
set(COLOBOT_I18N_DIR ${COLOBOT_INSTALL_I18N_DIR})
endif()
# Subdirectory with sources # Subdirectory with sources
add_subdirectory(src) add_subdirectory(src)

View File

@ -18,5 +18,5 @@
#cmakedefine PORTABLE_SAVES @PORTABLE_SAVES@ #cmakedefine PORTABLE_SAVES @PORTABLE_SAVES@
#define COLOBOT_DEFAULT_DATADIR "@COLOBOT_RELATIVE_DATA_DIR@" #define COLOBOT_DEFAULT_DATADIR "@COLOBOT_DATA_DIR@"
#define COLOBOT_I18N_DIR "@COLOBOT_RELATIVE_I18N_DIR@" #define COLOBOT_I18N_DIR "@COLOBOT_I18N_DIR@"

View File

@ -190,28 +190,28 @@ std::string CSystemUtils::GetBasePath()
std::string CSystemUtils::GetDataPath() std::string CSystemUtils::GetDataPath()
{ {
#if DEV_BUILD #ifdef USE_RELATIVE_PATHS
return std::string{"./"} + COLOBOT_DEFAULT_DATADIR;
#else
return GetBasePath() + COLOBOT_DEFAULT_DATADIR; return GetBasePath() + COLOBOT_DEFAULT_DATADIR;
#else
return COLOBOT_DEFAULT_DATADIR;
#endif #endif
} }
std::string CSystemUtils::GetLangPath() std::string CSystemUtils::GetLangPath()
{ {
#if DEV_BUILD #ifdef USE_RELATIVE_PATHS
return std::string{"./"} + COLOBOT_I18N_DIR;
#else
return GetBasePath() + COLOBOT_I18N_DIR; return GetBasePath() + COLOBOT_I18N_DIR;
#else
return COLOBOT_I18N_DIR;
#endif #endif
} }
std::string CSystemUtils::GetSaveDir() std::string CSystemUtils::GetSaveDir()
{ {
return "./saves"; return GetBasePath() + "saves";
} }
std::string CSystemUtils::GetEnvVar(const std::string& str) std::string CSystemUtils::GetEnvVar(const std::string& name)
{ {
return std::string(); return "";
} }

View File

@ -127,7 +127,7 @@ public:
/** The difference is \a after - \a before. */ /** The difference is \a after - \a before. */
virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0; virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0;
//! Returns the path where the executable binary is located //! Returns the path where the executable binary is located (ends with the path separator)
virtual std::string GetBasePath(); virtual std::string GetBasePath();
//! Returns the data path (containing textures, levels, helpfiles, etc) //! Returns the data path (containing textures, levels, helpfiles, etc)
@ -139,8 +139,8 @@ public:
//! Returns the save dir location //! Returns the save dir location
virtual std::string GetSaveDir(); virtual std::string GetSaveDir();
//! Returns environment variable //! Returns the environment variable with the given name or an empty string if it does not exist
virtual std::string GetEnvVar(const std::string &str); virtual std::string GetEnvVar(const std::string &name);
//! Sleep for given amount of microseconds //! Sleep for given amount of microseconds
virtual void Usleep(int usecs) = 0; virtual void Usleep(int usecs) = 0;

View File

@ -102,23 +102,23 @@ std::string CSystemUtilsLinux::GetSaveDir()
std::string savegameDir; std::string savegameDir;
// Determine savegame dir according to XDG Base Directory Specification // Determine savegame dir according to XDG Base Directory Specification
char *envXDG_DATA_HOME = getenv("XDG_DATA_HOME"); auto envXDG_DATA_HOME = GetEnvVar("XDG_DATA_HOME");
if (envXDG_DATA_HOME == nullptr) if (envXDG_DATA_HOME.empty())
{ {
char *envHOME = getenv("HOME"); auto envHOME = GetEnvVar("HOME");
if (envHOME == nullptr) if (envHOME.empty())
{ {
GetLogger()->Warn("Unable to find directory for saves - using current directory"); GetLogger()->Warn("Unable to find directory for saves - using default directory");
savegameDir = "./saves"; savegameDir = CSystemUtils::GetSaveDir();
} }
else else
{ {
savegameDir = std::string(envHOME) + "/.local/share/colobot"; savegameDir = envHOME + "/.local/share/colobot";
} }
} }
else else
{ {
savegameDir = std::string(envXDG_DATA_HOME) + "/colobot"; savegameDir = envXDG_DATA_HOME + "/colobot";
} }
GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str()); GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str());
@ -131,7 +131,6 @@ std::string CSystemUtilsLinux::GetEnvVar(const std::string& name)
char* envVar = getenv(name.c_str()); char* envVar = getenv(name.c_str());
if (envVar != nullptr) if (envVar != nullptr)
{ {
GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), envVar); GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), envVar);
return std::string(envVar); return std::string(envVar);
} }

View File

@ -36,7 +36,7 @@ public:
std::string GetLangPath() override; std::string GetLangPath() override;
std::string GetSaveDir() override; std::string GetSaveDir() override;
std::string GetEnvVar(const std::string& str) override; std::string GetEnvVar(const std::string& name) override;
void Usleep(int usec) override; void Usleep(int usec) override;

View File

@ -115,15 +115,15 @@ std::string CSystemUtilsWindows::GetSaveDir()
#else #else
std::string savegameDir; std::string savegameDir;
wchar_t* envUSERPROFILE = _wgetenv(L"USERPROFILE"); auto envUSERPROFILE = GetEnvVar("USERPROFILE");
if (envUSERPROFILE == nullptr) if (envUSERPROFILE.empty())
{ {
GetLogger()->Warn("Unable to find directory for saves - using current directory"); GetLogger()->Warn("Unable to find directory for saves - using default directory");
savegameDir = "./saves"; savegameDir = CSystemUtils::GetSaveDir();
} }
else else
{ {
savegameDir = UTF8_Encode(std::wstring(envUSERPROFILE)) + "\\colobot"; savegameDir = envUSERPROFILE + "\\colobot";
} }
GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str()); GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str());