]> git.tdb.fi Git - libs/game.git/blob - tools/builder-plugin/gamesetupdefinitions.cpp
Add import functionality for setup modules
[libs/game.git] / tools / builder-plugin / gamesetupdefinitions.cpp
1 #include "gamesetupdefinitions.h"
2 #include <msp/builder/builder.h>
3 #include <msp/builder/component.h>
4 #include <msp/datafile/parser.h>
5 #include <msp/fs/utils.h>
6 #include <msp/io/file.h>
7
8 using namespace std;
9 using namespace Msp;
10
11 GameSetupDefinitions::GameSetupDefinitions(Builder &b, const Component &c, const FS::Path &p):
12         SourceFile(b, c, p)
13 {
14         install_location = "include";
15 }
16
17 void GameSetupDefinitions::find_dependencies()
18 {
19         if(!mtime)
20                 return;
21
22         vector<string> imports;
23
24         Cache &cache = package->get_cache();
25         if(mtime<cache.get_mtime() && cache.has_key(this, "imports"))
26                 imports = cache.get_values(this, "imports");
27         else
28         {
29                 builder.get_logger().log("files", "Reading imports from %s", path.str());
30
31                 imports = parse_imports(path);
32                 cache.set_values(this, "imports", imports);
33         }
34
35         Tool *generator = builder.get_toolchain().get_tool_for_suffix(FS::extpart(FS::basename(path)));
36
37         BuildInfo binfo = component->get_build_info_for_path(path);
38         for(const string &i: imports)
39                 if(Target *imp = builder.get_vfs().find_header(i+".mgs", generator, binfo.incpath))
40                         add_dependency(*imp);
41 }
42
43 vector<string> GameSetupDefinitions::parse_imports(const FS::Path &fn)
44 {
45         vector<string> imports;
46
47         IO::BufferedFile in_file(fn.str());
48         DataFile::Parser parser(in_file, fn.str());
49         while(parser)
50         {
51                 DataFile::Statement st = parser.parse();
52                 if(st.keyword=="import" && st.args.size()==1)
53                         imports.push_back(st.args.front().get<string>());
54         }
55
56         return imports;
57 }