Add handling of env variables

modernize-cmake-1
MrSimbax 2020-04-03 20:15:24 +02:00
parent ad02b55541
commit d4b2f23c4a
12 changed files with 86 additions and 3 deletions

View File

@ -220,6 +220,30 @@ CSoundInterface* CApplication::GetSound()
return m_sound.get();
}
void CApplication::LoadEnvironmentVariables()
{
auto dataDir = m_systemUtils->GetEnvVar("COLOBOT_DATA_DIR");
if (!dataDir.empty())
{
m_pathManager->SetDataPath(dataDir);
GetLogger()->Info("Using data dir (based on environment variable): '%s'\n", dataDir.c_str());
}
auto langDir = m_systemUtils->GetEnvVar("COLOBOT_LANG_DIR");
if (!langDir.empty())
{
m_pathManager->SetLangPath(langDir);
GetLogger()->Info("Using lang dir (based on environment variable): '%s'\n", langDir.c_str());
}
auto saveDir = m_systemUtils->GetEnvVar("COLOBOT_SAVE_DIR");
if (!saveDir.empty())
{
m_pathManager->SetSavePath(saveDir);
GetLogger()->Info("Using save dir (based on environment variable): '%s'\n", saveDir.c_str());
}
}
ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
{
enum OptionType
@ -286,15 +310,18 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
GetLogger()->Message("\n");
GetLogger()->Message("%s\n", COLOBOT_FULLNAME);
GetLogger()->Message("\n");
GetLogger()->Message("List of available options:\n");
GetLogger()->Message("List of available options and environment variables:\n");
GetLogger()->Message(" -help this help\n");
GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n");
GetLogger()->Message(" -runscene sceneNNN run given scene on start\n");
GetLogger()->Message(" -scenetest win every mission right after it's loaded\n");
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
GetLogger()->Message(" -langdir path set custom language directory path\n");
GetLogger()->Message(" environment variable: COLOBOT_LANG_DIR\n");
GetLogger()->Message(" -datadir path set custom data directory path\n");
GetLogger()->Message(" environment variable: COLOBOT_DATA_DIR\n");
GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
GetLogger()->Message(" environment variable: COLOBOT_SAVE_DIR\n");
GetLogger()->Message(" -mod path load datadir mod from given path\n");
GetLogger()->Message(" -resolution WxH set resolution\n");
GetLogger()->Message(" -headless headless mode - disables graphics, sound and user interaction\n");

View File

@ -164,7 +164,9 @@ public:
CSoundInterface* GetSound();
public:
//! Parses commandline arguments
//! Loads some data from environment variables
void LoadEnvironmentVariables();
//! Parses commandline arguments (they take priority)
ParseArgsStatus ParseArguments(int argc, char *argv[]);
//! Initializes the application
bool Create();

View File

@ -172,6 +172,8 @@ int main(int argc, char *argv[])
int code = 0;
CApplication app(systemUtils.get()); // single instance of the application
app.LoadEnvironmentVariables();
ParseArgsStatus status = app.ParseArguments(argc, argv);
if (status == PARSE_ARGS_FAIL)
{

View File

@ -41,7 +41,7 @@ CPathManager::CPathManager(CSystemUtils* systemUtils)
: m_dataPath(systemUtils->GetDataPath())
, m_langPath(systemUtils->GetLangPath())
, m_savePath(systemUtils->GetSaveDir())
, m_modAutoloadDir{ m_dataPath + "/mods", m_savePath + "/mods" }
, m_modAutoloadDir{}
, m_mods{}
{
}
@ -130,6 +130,10 @@ void CPathManager::InitPaths()
{
GetLogger()->Info("Data path: %s\n", m_dataPath.c_str());
GetLogger()->Info("Save path: %s\n", m_savePath.c_str());
m_modAutoloadDir.push_back(m_dataPath + "/mods");
m_modAutoloadDir.push_back(m_savePath + "/mods");
if (!m_modAutoloadDir.empty())
{
GetLogger()->Info("Mod autoload dirs:\n");

View File

@ -210,3 +210,8 @@ std::string CSystemUtils::GetSaveDir()
{
return "./saves";
}
std::string CSystemUtils::GetEnvVar(const std::string& str)
{
return std::string();
}

View File

@ -139,6 +139,9 @@ public:
//! Returns the save dir location
virtual std::string GetSaveDir();
//! Returns environment variable
virtual std::string GetEnvVar(const std::string &str);
//! Sleep for given amount of microseconds
virtual void Usleep(int usecs) = 0;

View File

@ -126,6 +126,18 @@ std::string CSystemUtilsLinux::GetSaveDir()
#endif
}
std::string CSystemUtilsLinux::GetEnvVar(const std::string& name)
{
char* envVar = getenv(name.c_str());
if (envVar != nullptr)
{
GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), envVar);
return std::string(envVar);
}
return "";
}
void CSystemUtilsLinux::Usleep(int usec)
{
usleep(usec);

View File

@ -45,6 +45,8 @@ public:
std::string GetSaveDir() override;
std::string GetEnvVar(const std::string& name) override;
void Usleep(int usec) override;
private:

View File

@ -113,6 +113,12 @@ std::string CSystemUtilsMacOSX::GetSaveDir()
#endif
}
std::string CSystemUtilsMacOSX::GetEnvVar(const std::string& str)
{
// TODO: I have no Mac
return std::string();
}
void CSystemUtilsMacOSX::Usleep(int usec)
{
usleep(usec);

View File

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

View File

@ -131,6 +131,22 @@ std::string CSystemUtilsWindows::GetSaveDir()
#endif
}
std::string CSystemUtilsWindows::GetEnvVar(const std::string& name)
{
std::wstring wname(name.begin(), name.end());
wchar_t* envVar = _wgetenv(wname.c_str());
if (envVar == nullptr)
{
return "";
}
else
{
std::string var = UTF8_Encode(std::wstring(envVar));
GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), var.c_str());
return var;
}
}
void CSystemUtilsWindows::Usleep(int usec)
{
LARGE_INTEGER ft;

View File

@ -43,6 +43,8 @@ public:
std::string GetSaveDir() override;
std::string GetEnvVar(const std::string& name) override;
void Usleep(int usec) override;
public: