mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 19:52:31 +00:00 
			
		
		
		
	Merge pull request #4190 from YosysHQ/xdg
Follow the XDG Base Directory Specification
This commit is contained in:
		
						commit
						675b8a7319
					
				
					 3 changed files with 99 additions and 10 deletions
				
			
		|  | @ -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; | ||||
|  | @ -781,10 +842,10 @@ static int tcl_yosys_cmd(ClientData, Tcl_Interp *interp, int argc, const char *a | |||
| 
 | ||||
| int yosys_tcl_iterp_init(Tcl_Interp *interp) | ||||
| { | ||||
|     if (Tcl_Init(interp)!=TCL_OK) | ||||
| 	if (Tcl_Init(interp)!=TCL_OK) | ||||
| 		log_warning("Tcl_Init() call failed - %s\n",Tcl_ErrnoMsg(Tcl_GetErrno())); | ||||
| 	Tcl_CreateCommand(interp, "yosys", tcl_yosys_cmd, NULL, NULL); | ||||
|     return TCL_OK ; | ||||
| 	return TCL_OK ; | ||||
| } | ||||
| 
 | ||||
| void yosys_tcl_activate_repl() | ||||
|  |  | |||
|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue