X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=tools%2Fbuilder-plugin%2Fgamesetupgenerator.cpp;fp=tools%2Fbuilder-plugin%2Fgamesetupgenerator.cpp;h=3302c214d4cb9cf1f5aa4d02d641b72ced251936;hb=bb1c22d58cc71e68555a144ac884137c775ef427;hp=0000000000000000000000000000000000000000;hpb=dc90919dcc6519c7611ff7f8f6b7c22876e2fc13;p=libs%2Fgame.git diff --git a/tools/builder-plugin/gamesetupgenerator.cpp b/tools/builder-plugin/gamesetupgenerator.cpp new file mode 100644 index 0000000..3302c21 --- /dev/null +++ b/tools/builder-plugin/gamesetupgenerator.cpp @@ -0,0 +1,63 @@ +#include "gamesetupgenerator.h" +#include +#include +#include "gamesetupdefinitions.h" + +using namespace std; +using namespace Msp; + +GameSetupGenerator::GameSetupGenerator(Builder &b): + Tool(b, "MGSG") +{ + input_suffixes.push_back(".mgs"); + + set_command("mspgame-setupgen"); + set_run_external(_run); +} + +Target *GameSetupGenerator::create_source(const Component &comp, const FS::Path &path) const +{ + return new GameSetupDefinitions(builder, comp, path); +} + +Target *GameSetupGenerator::create_target(const vector &sources, const string &) +{ + if(sources.size()!=1) + throw invalid_argument("GameSetupGenerator::create_target"); + + GameSetupDefinitions &defs = dynamic_cast(*sources.front()); + + const Component &comp = *defs.get_component(); + const SourcePackage &spkg = comp.get_package(); + FS::Path dir = spkg.get_temp_directory()/"generated"; + dir /= FS::dirname(FS::relative(defs.get_path(), spkg.get_source_directory())); + + Tool &compiler = builder.get_toolchain().get_tool("CC"); + string base = FS::basepart(FS::basename(defs.get_path())); + Target *source = compiler.create_source(comp, dir/(base+".cpp")); + source->add_dependency(defs); + source->set_tool(*this); + + Target *header = compiler.create_source(comp, dir/(base+".h")); + header->add_dependency(defs); + source->add_side_effect(*header); + + return source; +} + +ExternalTask::Arguments GameSetupGenerator::_run(const CSourceFile &out_src, FS::Path &work_dir) +{ + const Tool &tool = *out_src.get_tool(); + + ExternalTask::Arguments argv; + argv.push_back(tool.get_executable()->get_path().str()); + + for(const Target *d: out_src.get_dependencies()) + if(const GameSetupDefinitions *defs = dynamic_cast(d)) + argv.push_back(FS::relative(defs->get_path(), work_dir).str()); + + argv.push_back("-o"); + argv.push_back(FS::relative(out_src.get_path(), work_dir).str()); + + return argv; +}