]> git.tdb.fi Git - builder.git/blobdiff - source/component.cpp
Various fixes to package dependency and build info handling
[builder.git] / source / component.cpp
index cf4234607e978d1f6399a2732adaded39496602d..87252d574f98c67548861757cacbdc931a6bdf1e 100644 (file)
@@ -5,6 +5,7 @@ Copyright © 2006-2010  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
+#include <algorithm>
 #include <msp/core/except.h>
 #include <msp/fs/dir.h>
 #include <msp/fs/stat.h>
@@ -41,10 +42,30 @@ Component::Component(SourcePackage &p, Type t, const string &n):
 
 void Component::create_build_info()
 {
-       build_info.add(pkg.get_build_info());
+       const PackageList &pkg_reqs = pkg.get_requires();
+       PackageList direct_reqs = requires;
+       direct_reqs.insert(direct_reqs.end(), pkg_reqs.begin(), pkg_reqs.end());
+
+       PackageList all_reqs = direct_reqs;
+       for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
+       {
+               if(find(direct_reqs.begin(), direct_reqs.end(), *i)!=direct_reqs.end())
+                       build_info.add((*i)->get_exported_binfo());
+               else
+               {
+                       const BuildInfo &ebi = (*i)->get_exported_binfo();
+                       build_info.cflags.insert(build_info.cflags.end(), ebi.cflags.begin(), ebi.cflags.end());
+                       build_info.incpath.insert(build_info.incpath.end(), ebi.incpath.begin(), ebi.incpath.end());
+                       build_info.defines.insert(build_info.defines.end(), ebi.defines.begin(), ebi.defines.end());
+               }
 
-       for(PackageList::iterator i=requires.begin(); i!=requires.end(); ++i)
-               build_info.add((*i)->get_exported_binfo());
+               const PackageList &reqs = (*i)->get_requires();
+               for(PackageList::const_iterator j=reqs.begin(); j!=reqs.end(); ++j)
+                       if(find(all_reqs.begin(), all_reqs.end(), *j)==all_reqs.end())
+                               all_reqs.push_back(*j);
+       }
+
+       build_info.add(pkg.get_build_info());
 
        for(StringList::iterator i=build_info.incpath.begin(); i!=build_info.incpath.end(); ++i)
                *i = (pkg.get_source() / *i).str();
@@ -53,9 +74,7 @@ void Component::create_build_info()
 
        if(pkg.get_library_mode()!=DYNAMIC)
        {
-               // XXX This may pull in some unnecessary libpaths too.  More thought required.
-               PackageList reqs = pkg.collect_requires();
-               for(PackageList::iterator i=reqs.begin(); i!=reqs.end(); ++i)
+               for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
                {
                        const BuildInfo &ebi = (*i)->get_exported_binfo();
                        build_info.libpath.insert(build_info.libpath.end(), ebi.libpath.begin(), ebi.libpath.end());