]> git.tdb.fi Git - builder.git/blobdiff - source/lib/component.cpp
Rearrange generated source paths
[builder.git] / source / lib / component.cpp
index 4fddcef79de59a9ca0ca6cf05e8a5b71ec565a79..1ba258bd70a00f4011587bd3617ccff24796a7ce 100644 (file)
@@ -4,6 +4,7 @@
 #include <msp/fs/stat.h>
 #include <msp/fs/utils.h>
 #include <msp/strings/format.h>
+#include <msp/strings/utils.h>
 #include "builder.h"
 #include "component.h"
 #include "sourcepackage.h"
@@ -13,16 +14,42 @@ using namespace Msp;
 
 void Component::prepare()
 {
-       for(Package *r: requires)
+       for(Package *r: required_pkgs)
+       {
                r->prepare();
+               broken |= r->is_broken();
+       }
+
+       if(!sources.empty())
+       {
+               for(auto i=sources.begin(); i!=sources.end(); ++i)
+               {
+                       FS::Path s = *i;
+                       if(!FS::is_dir(s))
+                               s = FS::dirname(s);
+
+                       if(i==sources.begin())
+                               source_base_path = s;
+                       else
+                               source_base_path = FS::common_ancestor(source_base_path, s);
+               }
+       }
+
+       if(!problems.empty())
+               broken = true;
 }
 
 void Component::create_build_info()
 {
        BuildInfo final_build_info;
+       string build_macro = toupper(name)+"_BUILD";
+       for(char &c: build_macro)
+               if(!isalnum(static_cast<unsigned char>(c)))
+                       c = '_';
+       final_build_info.defines[build_macro] = "1";
 
        const Package::Requirements &pkg_reqs = package.get_required_packages();
-       Package::Requirements direct_reqs = requires;
+       Package::Requirements direct_reqs = required_pkgs;
        direct_reqs.insert(direct_reqs.end(), pkg_reqs.begin(), pkg_reqs.end());
        for(Package *r: direct_reqs)
                final_build_info.update_from(r->get_exported_build_info(), BuildInfo::DEPENDENCY);
@@ -53,23 +80,33 @@ void Component::create_build_info()
                p = (package.get_source_directory()/p).str();
 }
 
+FS::Path Component::get_temp_directory() const
+{
+       return package.get_temp_directory()/name;
+}
+
+string Component::flatten_source_path(const FS::Path &source) const
+{
+       FS::Path temp_dir = get_temp_directory();
+       FS::Path rel_src;
+       if(FS::descendant_depth(source, temp_dir)>=0)
+               rel_src = FS::relative(source, temp_dir);
+       else
+               rel_src = FS::relative(source, source_base_path);
+
+       string fn;
+       for(const string &c: rel_src)
+               if(c!=".")
+                       append(fn, "_", c);
+
+       return fn;
+}
+
 BuildInfo Component::get_build_info_for_path(const FS::Path &path) const
 {
        // XXX Cache these and check that the directories actually exist before adding them
        BuildInfo binfo = build_info;
 
-       FS::Path gen_dir = package.get_temp_directory()/"generated";
-       if(FS::descendant_depth(path, gen_dir)>=0)
-       {
-               FS::Path subdir = FS::dirname(FS::relative(path, gen_dir));
-               binfo.local_incpath.push_back(package.get_source_directory()/subdir);
-       }
-       else
-       {
-               FS::Path subdir = FS::dirname(FS::relative(path, package.get_source_directory()));
-               binfo.local_incpath.push_back(gen_dir/subdir);
-       }
-
        if(!overlays.empty())
        {
                FS::Path dir = FS::dirname(path);
@@ -169,12 +206,15 @@ void Component::Loader::require(const string &n)
 {
        Package *req = obj.package.get_builder().get_package_manager().find_package(n);
        if(req)
-               obj.requires.push_back(req);
+               obj.required_pkgs.push_back(req);
        else
                obj.problems.push_back(format("Required package %s not found", n));
 }
 
 void Component::Loader::source(const string &s)
 {
-       obj.sources.push_back((obj.package.get_source_directory()/s).str());
+       FS::Path src_path = obj.package.get_source_directory()/s;
+       if(!FS::exists(src_path))
+               throw IO::file_not_found(src_path.str());
+       obj.sources.push_back(src_path);
 }