1 #include <msp/io/file.h>
2 #include <msp/io/print.h>
3 #include <msp/strings/utils.h>
5 #include "compilecommandsgenerator.h"
6 #include "compilecommandsjson.h"
7 #include "objectfile.h"
8 #include "sourcefile.h"
13 CompileCommandsGenerator::CompileCommandsGenerator(Builder &b):
17 Target *CompileCommandsGenerator::create_target(const list<Target *> &, const string &)
19 throw logic_error("Not implemented");
22 Task *CompileCommandsGenerator::run(const Target &target) const
24 const CompileCommandsJson &cmds = dynamic_cast<const CompileCommandsJson &>(target);
25 Worker *worker = new Worker(cmds);
26 return new InternalTask(worker);
30 CompileCommandsGenerator::Worker::Worker(const CompileCommandsJson &t):
34 void CompileCommandsGenerator::Worker::main()
36 Builder &builder = target.get_package()->get_builder();
37 const SourcePackage &spkg = *target.get_package();
38 string work_dir = c_escape(spkg.get_source_directory().str());
40 IO::BufferedFile out(target.get_path().str(), IO::M_WRITE);
44 for(const auto &kvp: builder.get_build_graph().get_targets())
45 if(kvp.second->is_buildable() && kvp.second->get_package()==&spkg)
46 if(ObjectFile *obj = dynamic_cast<ObjectFile *>(kvp.second))
48 FS::Path src_path = obj->get_source().get_path();
49 Task *task = kvp.second->build();
52 IO::print(out, "\n\t{\n");
53 IO::print(out, "\t\t\"file\": \"%s\"\n", src_path);
54 IO::print(out, "\t\t\"command\": \"%s\"\n", c_escape(task->get_command()));
55 IO::print(out, "\t\t\"directory\": \"%s\"\n", work_dir);
56 IO::print(out, "\t}");
61 IO::print(out, "\n]\n");
63 status = Task::SUCCESS;