]> git.tdb.fi Git - builder.git/blob - plugins/builtin/compilecommandsgenerator.cpp
Rearrange sources into subdirectories
[builder.git] / plugins / builtin / compilecommandsgenerator.cpp
1 #include <msp/builder/builder.h>
2 #include <msp/builder/objectfile.h>
3 #include <msp/builder/sourcefile.h>
4 #include <msp/io/file.h>
5 #include <msp/io/print.h>
6 #include <msp/strings/utils.h>
7 #include "compilecommandsgenerator.h"
8 #include "compilecommandsjson.h"
9
10 using namespace std;
11 using namespace Msp;
12
13 CompileCommandsGenerator::CompileCommandsGenerator(Builder &b):
14         Tool(b, "CCJG")
15 {
16         set_run_internal(_run);
17 }
18
19 Target *CompileCommandsGenerator::create_target(const vector<Target *> &, const string &)
20 {
21         throw logic_error("Not implemented");
22 }
23
24 bool CompileCommandsGenerator::_run(const CompileCommandsJson &cmds)
25 {
26         Builder &builder = cmds.get_package()->get_builder();
27         const SourcePackage &spkg = *cmds.get_package();
28         string work_dir = c_escape(spkg.get_source_directory().str());
29
30         IO::BufferedFile out(cmds.get_path().str(), IO::M_WRITE);
31         IO::print(out, "[");
32
33         bool first = true;
34         for(const auto &kvp: builder.get_build_graph().get_targets())
35                 if(kvp.second->is_buildable() && kvp.second->get_package()==&spkg)
36                         if(ObjectFile *obj = dynamic_cast<ObjectFile *>(kvp.second))
37                         {
38                                 FS::Path src_path = obj->get_source().get_path();
39                                 Task *task = kvp.second->build();
40                                 if(!first)
41                                         out.put(',');
42                                 IO::print(out, "\n\t{\n");
43                                 IO::print(out, "\t\t\"file\": \"%s\"\n", src_path);
44                                 IO::print(out, "\t\t\"command\": \"%s\"\n", c_escape(task->get_command()));
45                                 IO::print(out, "\t\t\"directory\": \"%s\"\n", work_dir);
46                                 IO::print(out, "\t}");
47                                 delete task;
48                                 first = false;
49                         }
50
51         IO::print(out, "\n]\n");
52
53         return true;
54 }