mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #4190 from YosysHQ/xdg
Follow the XDG Base Directory Specification
This commit is contained in:
commit
675b8a7319
|
@ -243,14 +243,6 @@ int main(int argc, char **argv)
|
|||
bool mode_v = false;
|
||||
bool mode_q = false;
|
||||
|
||||
#if defined(YOSYS_ENABLE_READLINE) || defined(YOSYS_ENABLE_EDITLINE)
|
||||
if (getenv("HOME") != NULL) {
|
||||
yosys_history_file = stringf("%s/.yosys_history", getenv("HOME"));
|
||||
read_history(yosys_history_file.c_str());
|
||||
yosys_history_offset = where_history();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "-help") || !strcmp(argv[1], "--help")))
|
||||
{
|
||||
printf("\n");
|
||||
|
@ -538,6 +530,36 @@ int main(int argc, char **argv)
|
|||
if (print_banner)
|
||||
yosys_banner();
|
||||
|
||||
#if defined(YOSYS_ENABLE_READLINE) || defined(YOSYS_ENABLE_EDITLINE)
|
||||
std::string state_dir;
|
||||
#if defined(_WIN32)
|
||||
if (getenv("HOMEDRIVE") != NULL && getenv("HOMEPATH") != NULL) {
|
||||
state_dir = stringf("%s%s/.local/state", getenv("HOMEDRIVE"), getenv("HOMEPATH"));
|
||||
} else {
|
||||
log_debug("$HOMEDRIVE and/or $HOMEPATH is empty. No history file will be created.\n");
|
||||
}
|
||||
#else
|
||||
if (getenv("XDG_STATE_HOME") == NULL || getenv("XDG_STATE_HOME")[0] == '\0') {
|
||||
if (getenv("HOME") != NULL) {
|
||||
state_dir = stringf("%s/.local/state", getenv("HOME"));
|
||||
} else {
|
||||
log_debug("$HOME is empty. No history file will be created.\n");
|
||||
}
|
||||
} else {
|
||||
state_dir = stringf("%s", getenv("XDG_STATE_HOME"));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!state_dir.empty()) {
|
||||
std::string yosys_dir = state_dir + "/yosys";
|
||||
create_directory(yosys_dir);
|
||||
|
||||
yosys_history_file = yosys_dir + "/history";
|
||||
read_history(yosys_history_file.c_str());
|
||||
yosys_history_offset = where_history();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (print_stats)
|
||||
log_hasher = new SHA1;
|
||||
|
||||
|
@ -569,6 +591,8 @@ int main(int argc, char **argv)
|
|||
for (auto &fn : plugin_filenames)
|
||||
load_plugin(fn, {});
|
||||
|
||||
log_suppressed();
|
||||
|
||||
if (!vlog_defines.empty()) {
|
||||
std::string vdef_cmd = "read -define";
|
||||
for (auto vdef : vlog_defines)
|
||||
|
|
|
@ -436,6 +436,25 @@ std::string make_temp_dir(std::string template_str)
|
|||
#endif
|
||||
}
|
||||
|
||||
bool check_directory_exists(const std::string& dirname)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
struct _stat info;
|
||||
if (_stat(dirname.c_str(), &info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (info.st_mode & _S_IFDIR) != 0;
|
||||
#else
|
||||
struct stat info;
|
||||
if (stat(dirname.c_str(), &info) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (info.st_mode & S_IFDIR) != 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
bool check_file_exists(std::string filename, bool)
|
||||
{
|
||||
|
@ -481,6 +500,48 @@ void remove_directory(std::string dirname)
|
|||
#endif
|
||||
}
|
||||
|
||||
bool create_directory(const std::string& dirname)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
int ret = _mkdir(dirname.c_str());
|
||||
#else
|
||||
mode_t mode = 0755;
|
||||
int ret = mkdir(dirname.c_str(), mode);
|
||||
#endif
|
||||
if (ret == 0)
|
||||
return true;
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
case ENOENT:
|
||||
// parent didn't exist, try to create it
|
||||
{
|
||||
std::string::size_type pos = dirname.find_last_of('/');
|
||||
if (pos == std::string::npos)
|
||||
#if defined(_WIN32)
|
||||
pos = dirname.find_last_of('\\');
|
||||
if (pos == std::string::npos)
|
||||
#endif
|
||||
return false;
|
||||
if (!create_directory( dirname.substr(0, pos) ))
|
||||
return false;
|
||||
}
|
||||
// now, try to create again
|
||||
#if defined(_WIN32)
|
||||
return 0 == _mkdir(dirname.c_str());
|
||||
#else
|
||||
return 0 == mkdir(dirname.c_str(), mode);
|
||||
#endif
|
||||
|
||||
case EEXIST:
|
||||
// done!
|
||||
return check_directory_exists(dirname);
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
std::string escape_filename_spaces(const std::string& filename)
|
||||
{
|
||||
std::string out;
|
||||
|
|
|
@ -66,6 +66,8 @@
|
|||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef WITH_PYTHON
|
||||
#include <Python.h>
|
||||
|
@ -341,8 +343,10 @@ std::string get_base_tmpdir();
|
|||
std::string make_temp_file(std::string template_str = get_base_tmpdir() + "/yosys_XXXXXX");
|
||||
std::string make_temp_dir(std::string template_str = get_base_tmpdir() + "/yosys_XXXXXX");
|
||||
bool check_file_exists(std::string filename, bool is_exec = false);
|
||||
bool check_directory_exists(const std::string& dirname);
|
||||
bool is_absolute_path(std::string filename);
|
||||
void remove_directory(std::string dirname);
|
||||
bool create_directory(const std::string& dirname);
|
||||
std::string escape_filename_spaces(const std::string& filename);
|
||||
|
||||
template<typename T> int GetSize(const T &obj) { return obj.size(); }
|
||||
|
|
Loading…
Reference in New Issue