]> git.tdb.fi Git - builder.git/blobdiff - source/lib/sourcepackage.cpp
Convert builtin tools into a plugin
[builder.git] / source / lib / sourcepackage.cpp
index 3648df727f3f109b01c248a456679a21136fc029..dfbf16e92553737e9aa9a333db5b5a4a13d048e0 100644 (file)
@@ -9,17 +9,14 @@
 #include "binarycomponent.h"
 #include "binarypackage.h"
 #include "builder.h"
-#include "builtin/compilecommandsjson.h"
 #include "datafile/datapackcomponent.h"
 #include "file.h"
 #include "installcomponent.h"
-#include "builtin/pkgconfigfile.h"
+#include "plugin.h"
 #include "sourcearchivecomponent.h"
 #include "sourcegenerator.h"
 #include "sourcepackage.h"
 #include "tool.h"
-#include "builtin/vcxprojectfile.h"
-#include "builtin/vssolutionfile.h"
 
 using namespace std;
 using namespace Msp;
@@ -135,28 +132,15 @@ void SourcePackage::do_prepare()
        for(Component *c: components)
                c->create_targets();
 
-       const Architecture &arch = builder.get_native_arch();
        if(!export_binfo.libs.empty())
        {
                export_binfo.incpath.push_back((builder.get_prefix()/"include").str());
                export_binfo.libpath.push_back((builder.get_prefix()/"lib").str());
-
-               if(arch.get_system()=="linux")
-               {
-                       PkgConfigFile *pc = new PkgConfigFile(builder, *this);
-                       builder.get_build_graph().get_target("install")->add_dependency(*builder.get_toolchain().get_tool("CP").create_target(*pc));
-               }
        }
 
        export_binfo.standards = build_info.standards;
 
-       if(arch.get_system()=="windows")
-       {
-               new VcxProjectFile(builder, *this);
-               new VsSolutionFile(builder, *this);
-       }
-
-       new CompileCommandsJson(builder, *this);
+       builder.call_plugins([this](const Plugin &p){ p.create_targets(*this); });
 }
 
 void SourcePackage::save_caches()
@@ -179,9 +163,9 @@ SourcePackage::Loader::Loader(SourcePackage &p, const Config::InputOptions *o):
        add("generate",    &Loader::generate);
        add("install",     &Loader::component<InstallComponent>);
        add("interface_version", &Loader::interface_version);
-       add("library",     &Loader::component_arg<BinaryComponent, BinaryComponent::Type>, BinaryComponent::LIBRARY);
-       add("module",      &Loader::component_arg<BinaryComponent, BinaryComponent::Type>, BinaryComponent::MODULE);
-       add("program",     &Loader::component_arg<BinaryComponent, BinaryComponent::Type>, BinaryComponent::PROGRAM);
+       add("library",     &Loader::component<BinaryComponent, BinaryComponent::Type>, BinaryComponent::LIBRARY);
+       add("module",      &Loader::component<BinaryComponent, BinaryComponent::Type>, BinaryComponent::MODULE);
+       add("program",     &Loader::component<BinaryComponent, BinaryComponent::Type>, BinaryComponent::PROGRAM);
        add("source_archive", &Loader::source_archive);
        add("source_tarball", &Loader::source_archive);
        add("tarball",     &Loader::tarball);
@@ -216,18 +200,12 @@ void SourcePackage::Loader::feature(const string &n, const string &d)
        }
 }
 
-template<typename C>
-void SourcePackage::Loader::component(const string &n)
-{
-       C *comp = new C(obj, n);
-       load_sub(*comp);
-       obj.components.push_back(comp);
-}
-
-template<typename C, typename A>
-void SourcePackage::Loader::component_arg(A a, const string &n)
+template<typename C, typename... Args>
+void SourcePackage::Loader::component(Args... args, const string &n)
 {
-       C *comp = new C(obj, n, a);
+       if(any_of(obj.components.begin(), obj.components.end(), [&n](const Component *c){ return c->get_name()==n; }))
+               throw key_error(n);
+       C *comp = new C(obj, n, args...);
        load_sub(*comp);
        obj.components.push_back(comp);
 }