From 96be30af0f63306753416a5948351cfcb46bc00a Mon Sep 17 00:00:00 2001 From: Jason Perkins Date: Thu, 9 Jun 2011 15:15:39 -0400 Subject: Added project.getvpath() to map from real paths --- src/base/project.lua | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'src/base') diff --git a/src/base/project.lua b/src/base/project.lua index 1e70633..261f0fa 100644 --- a/src/base/project.lua +++ b/src/base/project.lua @@ -524,7 +524,48 @@ end - + +-- +-- Given a source file path, return a corresponding virtual path based on +-- the vpath entries in the project. If no matching vpath entry is found, +-- the original path is returned. +-- + + function premake.project.getvpath(prj, filename) + -- if there is no match, return the input filename + local vpath = filename + + for pattern, replacement in pairs(prj.vpaths) do + -- does the filename match this vpath pattern? + local i = vpath:find(path.wildcards(pattern)) + if i == 1 then + -- yes; trim the leading portion of the path + i = pattern:find("*", 1, true) or (pattern:len() + 1) + local leaf = vpath:sub(i) + if leaf:startswith("/") then + leaf = leaf:sub(2) + end + + -- check for (and remove) stars in the replacement pattern. + -- If there are none, then trim all path info from the leaf + -- and use just the filename in the replacement (stars should + -- really only appear at the end; I'm cheating here) + local stem = "" + if replacement:len() > 0 then + stem, stars = replacement:gsub("%*", "") + if stars == 0 then + leaf = path.getname(leaf) + end + end + + vpath = path.join(stem, leaf) + end + end + + return vpath + end + + -- -- Returns true if the solution contains at least one C/C++ project. -- -- cgit v1.2.3