]> git.tdb.fi Git - builder.git/blobdiff - source/datatransform.cpp
Reimplement datafile building
[builder.git] / source / datatransform.cpp
diff --git a/source/datatransform.cpp b/source/datatransform.cpp
new file mode 100644 (file)
index 0000000..67b892e
--- /dev/null
@@ -0,0 +1,63 @@
+#include <msp/fs/dir.h>
+#include <msp/fs/utils.h>
+#include <msp/strings/format.h>
+#include <msp/strings/regex.h>
+#include "builder.h"
+#include "cache.h"
+#include "component.h"
+#include "datatransform.h"
+#include "file.h"
+#include "sourcepackage.h"
+
+using namespace std;
+using namespace Msp;
+
+DataTransform::DataTransform(Builder &b, const Component &c, const FS::Path &p):
+       FileTarget(b, c.get_package(), p)
+{
+       component = &c;
+}
+
+void DataTransform::find_dependencies()
+{
+       list<string> files;
+       Cache &cache = component->get_package().get_cache();
+       // XXX Should check directory mtime as well
+       if(mtime<cache.get_mtime() && cache.has_key(this, "files"))
+               files = cache.get_values(this, "files");
+       else
+       {
+               builder.get_logger().log("files", format("Reading imports from %s", path.str()));
+
+               list<string> dir_files = list_files(FS::dirname(path));
+               IO::File in(path.str());
+               DataFile::Parser parser(in, path.str());
+               while(!in.eof())
+               {
+                       DataFile::Statement st = parser.parse();
+                       if(st.keyword=="for_each")
+                       {
+                               for(DataFile::Statement::Arguments::const_iterator i=st.args.begin(); i!=st.args.end(); ++i)
+                               {
+                                       Regex re(i->get<string>());
+                                       for(list<string>::const_iterator j=dir_files.begin(); j!=dir_files.end(); ++j)
+                                               if(re.match(*j))
+                                                       files.push_back(*j);
+                               }
+                       }
+                       else if(st.keyword=="file" && st.args.size()==1)
+                               files.push_back(st.args.front().get<string>());
+               }
+
+               cache.set_values(this, "files", files);
+       }
+
+       for(list<string>::iterator i=files.begin(); i!=files.end(); ++i)
+       {
+               FS::Path file_path = FS::dirname(path)/ *i;
+               if(Target *tgt = builder.get_vfs().get_target(file_path))
+                       add_dependency(*tgt);
+               else
+                       add_dependency(*new File(builder, *package, file_path));
+       }
+}