diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-04-28 18:46:11 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-04-28 18:46:11 +0300 |
commit | 9ebd737df38e3d5ce5c9c584586c4bf29c50f424 (patch) | |
tree | f2f2f5967185617e16f4396b7868f2f975743649 /intern/cycles/util/util_path.cpp | |
parent | b46aad19c05c3a0f713b4ad9e3b4c771119df0d1 (diff) |
Cycles: Use relative path for #line directives
This way moving Blender bundle around doesn't re-trigger kernels compilation.
Diffstat (limited to 'intern/cycles/util/util_path.cpp')
-rw-r--r-- | intern/cycles/util/util_path.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/intern/cycles/util/util_path.cpp b/intern/cycles/util/util_path.cpp index cd3067f7650..08624cfc739 100644 --- a/intern/cycles/util/util_path.cpp +++ b/intern/cycles/util/util_path.cpp @@ -768,9 +768,17 @@ bool path_remove(const string& path) return remove(path.c_str()) == 0; } -static string line_directive(const string& path, int line) +static string line_directive(const string& base, const string& path, int line) { string escaped_path = path; + /* First we make path relative. */ + if(string_startswith(escaped_path, base.c_str())) { + const string base_file = path_filename(base); + const size_t base_len = base.length(); + escaped_path = base_file + escaped_path.substr(base_len, + escaped_path.length() - base_len); + } + /* Second, we replace all unsafe characters. */ string_replace(escaped_path, "\"", "\\\""); string_replace(escaped_path, "\'", "\\\'"); string_replace(escaped_path, "\?", "\\\?"); @@ -779,12 +787,14 @@ static string line_directive(const string& path, int line) } -string path_source_replace_includes(const string& source, - const string& path, - const string& source_filename) +static string path_source_replace_includes_recursive( + const string& base, + const string& source, + const string& path, + const string& source_filename) { /* Our own little c preprocessor that replaces #includes with the file - * contents, to work around issue of opencl drivers not supporting + * contents, to work around issue of OpenCL drivers not supporting * include paths with spaces in them. */ @@ -813,9 +823,9 @@ string path_source_replace_includes(const string& source, text, path_dirname(filepath), filename); text = path_source_replace_includes(text, path, filename); /* Use line directives for better error messages. */ - line = line_directive(filepath, 1) + line = line_directive(base, filepath, 1) + token.replace(0, n_end + 1, "\n" + text + "\n") - + line_directive(path_join(path, source_filename), i + 1); + + line_directive(base, path_join(path, source_filename), i + 1); } } } @@ -826,6 +836,13 @@ string path_source_replace_includes(const string& source, return result; } +string path_source_replace_includes(const string& source, + const string& path, + const string& source_filename) +{ + return path_source_replace_includes_recursive(path, source, path, source_filename); +} + FILE *path_fopen(const string& path, const string& mode) { #ifdef _WIN32 |