]> git.tdb.fi Git - builder.git/blobdiff - source/installmap.cpp
Flexible way to specify install locations for components
[builder.git] / source / installmap.cpp
diff --git a/source/installmap.cpp b/source/installmap.cpp
new file mode 100644 (file)
index 0000000..22d92b1
--- /dev/null
@@ -0,0 +1,48 @@
+#include <msp/fs/utils.h>
+#include "filetarget.h"
+#include "installmap.h"
+
+using namespace std;
+using namespace Msp;
+
+void InstallMap::add_mapping(const FS::Path &src, const FS::Path &inst)
+{
+       Entry e;
+       e.source = src;
+       e.install = inst;
+       entries.push_back(e);
+}
+
+FS::Path InstallMap::get_install_location(const FileTarget &target) const
+{
+       const FS::Path &source = target.get_path();
+       FS::Path install = target.get_install_location();
+       for(list<Entry>::const_iterator i=entries.begin(); i!=entries.end(); ++i)
+       {
+               int source_depth = FS::descendant_depth(source, i->source);
+               if(source_depth>=0)
+               {
+                       FS::Path install_base = FS::common_ancestor(install, i->install);
+                       if(install_base.size()>1)
+                       {
+                               install = i->install/FS::dirname(source).subpath(i->source.size());
+                               break;
+                       }
+               }
+       }
+
+       return install;
+}
+
+
+InstallMap::Loader::Loader(InstallMap &m, const FS::Path &s):
+       DataFile::ObjectLoader<InstallMap>(m),
+       source_base(s)
+{
+       add("map", &Loader::map);
+}
+
+void InstallMap::Loader::map(const string &src, const string &inst)
+{
+       obj.add_mapping(source_base/src, inst);
+}