Merge pull request #452 from cr1901/master

Accommodate Windows-style paths during include-file processing.
This commit is contained in:
Clifford Wolf 2017-11-18 09:58:40 +01:00 committed by GitHub
commit a4195e83c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 4 deletions

View File

@ -366,14 +366,31 @@ std::string frontend_verilog_preproc(std::istream &f, std::string filename, cons
ff.clear();
std::string fixed_fn = fn;
ff.open(fixed_fn.c_str());
if (ff.fail() && fn.size() > 0 && fn[0] != '/' && filename.find('/') != std::string::npos) {
bool filename_path_sep_found;
bool fn_relative;
#ifdef _WIN32
// Both forward and backslash are acceptable separators on Windows.
filename_path_sep_found = (filename.find_first_of("/\\") != std::string::npos);
// Easier just to invert the check for an absolute path (e.g. C:\ or C:/)
fn_relative = !(fn[1] == ':' && (fn[2] == '/' || fn[2] == '\\'));
#else
filename_path_sep_found = (filename.find('/') != std::string::npos);
fn_relative = (fn[0] != '/');
#endif
if (ff.fail() && fn.size() > 0 && fn_relative && filename_path_sep_found) {
// if the include file was not found, it is not given with an absolute path, and the
// currently read file is given with a path, then try again relative to its directory
ff.clear();
#ifdef _WIN32
fixed_fn = filename.substr(0, filename.find_last_of("/\\")+1) + fn;
#else
fixed_fn = filename.substr(0, filename.rfind('/')+1) + fn;
#endif
ff.open(fixed_fn);
}
if (ff.fail() && fn.size() > 0 && fn[0] != '/') {
if (ff.fail() && fn.size() > 0 && fn_relative) {
// if the include file was not found and it is not given with an absolute path, then
// search it in the include path
for (auto incdir : include_dirs) {
@ -521,4 +538,3 @@ std::string frontend_verilog_preproc(std::istream &f, std::string filename, cons
}
YOSYS_NAMESPACE_END