X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdatatransform.cpp;fp=source%2Fdatatransform.cpp;h=67b892ede81de5f8ce1fda4db26dfff666870a35;hb=d334fc1d04b7f83c7a2e9f16439fec884f4de471;hp=0000000000000000000000000000000000000000;hpb=65ba6a595dd4a1d74675abcfdf96307062dc43eb;p=builder.git diff --git a/source/datatransform.cpp b/source/datatransform.cpp new file mode 100644 index 0000000..67b892e --- /dev/null +++ b/source/datatransform.cpp @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#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 files; + Cache &cache = component->get_package().get_cache(); + // XXX Should check directory mtime as well + if(mtime 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()); + for(list::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()); + } + + cache.set_values(this, "files", files); + } + + for(list::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)); + } +}