mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Observe $TMPDIR variable when creating tmp files
POSIX defines $TMPDIR as containing the pathname of the directory where programs can create temporary files. On most systems, this variable points to "/tmp". However, on some systems it can point to a different location. Without respecting this variable, yosys fails to run on such systems. Signed-off-by: Mohamed A. Bamakhrama <mohamed@alumni.tum.de>
This commit is contained in:
		
							parent
							
								
									f9b6fe521d
								
							
						
					
					
						commit
						1822be8792
					
				
					 6 changed files with 37 additions and 7 deletions
				
			
		|  | @ -33,7 +33,7 @@ FstData::FstData(std::string filename) : ctx(nullptr) | ||||||
| 	std::string filename_trim = file_base_name(filename); | 	std::string filename_trim = file_base_name(filename); | ||||||
| 	if (filename_trim.size() > 4 && filename_trim.compare(filename_trim.size()-4, std::string::npos, ".vcd") == 0) { | 	if (filename_trim.size() > 4 && filename_trim.compare(filename_trim.size()-4, std::string::npos, ".vcd") == 0) { | ||||||
| 		filename_trim.erase(filename_trim.size()-4); | 		filename_trim.erase(filename_trim.size()-4); | ||||||
| 		tmp_file = stringf("/tmp/converted_%s.fst", filename_trim.c_str()); | 		tmp_file = stringf("%s/converted_%s.fst", get_base_tmpdir().c_str(), filename_trim.c_str()); | ||||||
| 		std::string cmd = stringf("vcd2fst %s %s", filename.c_str(), tmp_file.c_str()); | 		std::string cmd = stringf("vcd2fst %s %s", filename.c_str(), tmp_file.c_str()); | ||||||
| 		log("Exec: %s\n", cmd.c_str()); | 		log("Exec: %s\n", cmd.c_str()); | ||||||
| 		if (run_command(cmd) != 0) | 		if (run_command(cmd) != 0) | ||||||
|  |  | ||||||
|  | @ -376,6 +376,35 @@ int run_command(const std::string &command, std::function<void(const std::string | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | // POSIX defines `TMPDIR` as the pathname of the directory
 | ||||||
|  | // where programs can create temporary files. On most systems,
 | ||||||
|  | // it points to '/tmp'. However, on some systems it can be a different
 | ||||||
|  | // location
 | ||||||
|  | // Source: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03
 | ||||||
|  | std::string get_base_tmpdir() | ||||||
|  | { | ||||||
|  | 	// We cache the directory name in a static variable here
 | ||||||
|  | 	// for faster calls later
 | ||||||
|  | 	static std::string tmpdir; | ||||||
|  | 
 | ||||||
|  | 	if (!tmpdir.empty()) { | ||||||
|  | 		return tmpdir; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	char * var = std::getenv("TMPDIR"); | ||||||
|  | 	if (NULL == var) { | ||||||
|  | 		// if the variable is not set, then use '/tmp'
 | ||||||
|  | 		tmpdir.assign("/tmp"); | ||||||
|  | 	} else { | ||||||
|  | 		tmpdir.assign(var); | ||||||
|  | 		// We return the directory name without the trailing '/'
 | ||||||
|  | 		if (tmpdir.back() == '/') { | ||||||
|  | 			tmpdir.pop_back(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return tmpdir; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::string make_temp_file(std::string template_str) | std::string make_temp_file(std::string template_str) | ||||||
| { | { | ||||||
| #if defined(__wasm) | #if defined(__wasm) | ||||||
|  | @ -384,7 +413,7 @@ std::string make_temp_file(std::string template_str) | ||||||
| 	static size_t index = 0; | 	static size_t index = 0; | ||||||
| 	template_str.replace(pos, 6, stringf("%06zu", index++)); | 	template_str.replace(pos, 6, stringf("%06zu", index++)); | ||||||
| #elif defined(_WIN32) | #elif defined(_WIN32) | ||||||
| 	if (template_str.rfind("/tmp/", 0) == 0) { | 	if (template_str.rfind(get_base_tmpdir() + "/", 0) == 0) { | ||||||
| #  ifdef __MINGW32__ | #  ifdef __MINGW32__ | ||||||
| 		char longpath[MAX_PATH + 1]; | 		char longpath[MAX_PATH + 1]; | ||||||
| 		char shortpath[MAX_PATH + 1]; | 		char shortpath[MAX_PATH + 1]; | ||||||
|  |  | ||||||
|  | @ -278,8 +278,9 @@ bool patmatch(const char *pattern, const char *string); | ||||||
| #if !defined(YOSYS_DISABLE_SPAWN) | #if !defined(YOSYS_DISABLE_SPAWN) | ||||||
| int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>()); | int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>()); | ||||||
| #endif | #endif | ||||||
| std::string make_temp_file(std::string template_str = "/tmp/yosys_XXXXXX"); | std::string get_base_tmpdir(); | ||||||
| std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX"); | 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_file_exists(std::string filename, bool is_exec = false); | ||||||
| bool is_absolute_path(std::string filename); | bool is_absolute_path(std::string filename); | ||||||
| void remove_directory(std::string dirname); | void remove_directory(std::string dirname); | ||||||
|  |  | ||||||
|  | @ -251,7 +251,7 @@ QbfSolutionType call_qbf_solver(RTLIL::Module *mod, const QbfSolveOptions &opt, | ||||||
| 
 | 
 | ||||||
| QbfSolutionType qbf_solve(RTLIL::Module *mod, const QbfSolveOptions &opt) { | QbfSolutionType qbf_solve(RTLIL::Module *mod, const QbfSolveOptions &opt) { | ||||||
| 	QbfSolutionType ret, best_soln; | 	QbfSolutionType ret, best_soln; | ||||||
| 	const std::string tempdir_name = make_temp_dir("/tmp/yosys-qbfsat-XXXXXX"); | 	const std::string tempdir_name = make_temp_dir(get_base_tmpdir() + "/yosys-qbfsat-XXXXXX"); | ||||||
| 	RTLIL::Module *module = mod; | 	RTLIL::Module *module = mod; | ||||||
| 	RTLIL::Design *design = module->design; | 	RTLIL::Design *design = module->design; | ||||||
| 	std::string module_name = module->name.str(); | 	std::string module_name = module->name.str(); | ||||||
|  |  | ||||||
|  | @ -780,7 +780,7 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin | ||||||
| 	if (dff_mode && clk_sig.empty()) | 	if (dff_mode && clk_sig.empty()) | ||||||
| 		log_cmd_error("Clock domain %s not found.\n", clk_str.c_str()); | 		log_cmd_error("Clock domain %s not found.\n", clk_str.c_str()); | ||||||
| 
 | 
 | ||||||
| 	std::string tempdir_name = "/tmp/" + proc_program_prefix()+ "yosys-abc-XXXXXX"; | 	std::string tempdir_name = get_base_tmpdir() + "/" + proc_program_prefix()+ "yosys-abc-XXXXXX"; | ||||||
| 	if (!cleanup) | 	if (!cleanup) | ||||||
| 		tempdir_name[0] = tempdir_name[4] = '_'; | 		tempdir_name[0] = tempdir_name[4] = '_'; | ||||||
| 	tempdir_name = make_temp_dir(tempdir_name); | 	tempdir_name = make_temp_dir(tempdir_name); | ||||||
|  |  | ||||||
|  | @ -404,7 +404,7 @@ struct Abc9Pass : public ScriptPass | ||||||
| 					if (!active_design->selected_whole_module(mod)) | 					if (!active_design->selected_whole_module(mod)) | ||||||
| 						log_error("Can't handle partially selected module %s!\n", log_id(mod)); | 						log_error("Can't handle partially selected module %s!\n", log_id(mod)); | ||||||
| 
 | 
 | ||||||
| 					std::string tempdir_name = "/tmp/" + proc_program_prefix() + "yosys-abc-XXXXXX"; | 					std::string tempdir_name = get_base_tmpdir() + "/" + proc_program_prefix() + "yosys-abc-XXXXXX"; | ||||||
| 					if (!cleanup) | 					if (!cleanup) | ||||||
| 						tempdir_name[0] = tempdir_name[4] = '_'; | 						tempdir_name[0] = tempdir_name[4] = '_'; | ||||||
| 					tempdir_name = make_temp_dir(tempdir_name); | 					tempdir_name = make_temp_dir(tempdir_name); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue