diff options
Diffstat (limited to 'build/context.txx')
-rw-r--r-- | build/context.txx | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/build/context.txx b/build/context.txx index 53081b1..218c65e 100644 --- a/build/context.txx +++ b/build/context.txx @@ -46,7 +46,7 @@ namespace build template <typename T> fs_status<rmdir_status> - rmdir (const path& d, const T& t) + rmdir (const dir_path& d, const T& t) { bool w (d == work); // Don't try to remove working directory. rmdir_status rs; @@ -97,4 +97,42 @@ namespace build return rs; } + + template <typename K> + basic_path<char, K> + relative (const basic_path<char, K>& p) + { + typedef basic_path<char, K> path; + + const dir_path& b (*relative_base); + + if (b.empty ()) + return p; + + if (p.sub (b)) + return p.leaf (b); + + // If base is a sub-path of {src,out}_root and this path is also a + // sub-path of it, then use '..' to form a relative path. + // + // Don't think this is a good heuristic. For example, why shouldn't + // we display paths from imported projects as relative if they are + // more readable than absolute? + // + /* + if ((work.sub (src_root) && p.sub (src_root)) || + (work.sub (out_root) && p.sub (out_root))) + return p.relative (work); + */ + + if (p.root_directory () == b.root_directory ()) + { + path r (p.relative (b)); + + if (r.string ().size () < p.string ().size ()) + return r; + } + + return p; + } } |