From: Mikko Rasa Date: Wed, 10 Feb 2010 14:18:12 +0000 (+0000) Subject: Various fixes to package dependency and build info handling X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=49ee08bb6f63f6b3a8cdd3b7cf032dea9b2cba8a;p=builder.git Various fixes to package dependency and build info handling --- diff --git a/source/builder.cpp b/source/builder.cpp index 37ad766..55bee15 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -243,33 +243,42 @@ int Builder::main() return 0; } - if(!conf_only && create_targets()) - return 1; - - PackageList all_reqs = main_pkg->collect_requires(); - if(conf_only) return 0; + if(create_targets()) + return 1; + if(verbose>=2) { IO::print("Building on %s, for %s%s\n", native_arch.get_name(), current_arch->get_name(), (current_arch->is_native() ? " (native)" : "")); IO::print("Prefix is %s\n", prefix); } + if(verbose>=1) - IO::print("%d active packages, %d targets\n", all_reqs.size(), targets.size()); + { + unsigned n_packages = 0; + for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + if(i->second->is_configured()) + ++n_packages; + IO::print("%d active packages, %d targets\n", n_packages, targets.size()); + } + if(verbose>=2) { - for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) + for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { - IO::print(" %s", (*i)->get_name()); - if(dynamic_cast(*i)) + if(!i->second->is_configured()) + continue; + + IO::print(" %s", i->second->get_name()); + if(dynamic_cast(i->second)) IO::print("*"); unsigned count = 0; unsigned to_be_built = 0; for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j) - if(j->second->get_package()==*i) + if(j->second->get_package()==i->second) { ++count; if(j->second->get_rebuild()) @@ -599,10 +608,12 @@ int Builder::create_targets() Target *tarballs = new VirtualTarget(*this, "tarballs"); world->add_depend(tarballs); - PackageList all_reqs = main_pkg->collect_requires(); - for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) + for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { - SourcePackage *spkg = dynamic_cast(*i); + if(!i->second->is_configured()) + continue; + + SourcePackage *spkg = dynamic_cast(i->second); if(!spkg) continue; diff --git a/source/component.cpp b/source/component.cpp index cf42346..87252d5 100644 --- a/source/component.cpp +++ b/source/component.cpp @@ -5,6 +5,7 @@ Copyright © 2006-2010 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ +#include #include #include #include @@ -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()); diff --git a/source/package.cpp b/source/package.cpp index f137429..c3d7d75 100644 --- a/source/package.cpp +++ b/source/package.cpp @@ -22,22 +22,6 @@ Package::Package(Builder &b, const string &n): use_pkgconfig(true) { } -PackageList Package::collect_requires() -{ - PackageList result; - result.push_back(this); - for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i) - { - PackageList r = (*i)->collect_requires(); - result.splice(result.end(), r); - } - - result.sort(); - result.unique(); - - return result; -} - void Package::configure(const StringMap &opts, unsigned flag) { if(conf_done) diff --git a/source/package.h b/source/package.h index 2ee932b..411eff0 100644 --- a/source/package.h +++ b/source/package.h @@ -56,10 +56,6 @@ public: Builder &get_builder() const { return builder; } const PackageList &get_requires() const { return requires; } - /** Returns a list of all directly and indirectly required packages, - including the package itself. */ - PackageList collect_requires(); - const BuildInfo &get_exported_binfo() const { return export_binfo; } /// Indicates whether or not this package supports pkg-config @@ -68,6 +64,8 @@ public: /** Processes configuration options that were most likely obtained from the command line. */ void configure(const StringMap &, unsigned); + + bool is_configured() const { return conf_done; } protected: virtual void do_configure(const StringMap &, unsigned) { } virtual void create_build_info() { } diff --git a/source/sourcepackage.cpp b/source/sourcepackage.cpp index 3b10737..df1677f 100644 --- a/source/sourcepackage.cpp +++ b/source/sourcepackage.cpp @@ -107,14 +107,6 @@ void SourcePackage::do_configure(const StringMap &opts, unsigned flag) requires.push_back(pkg); } - base_reqs = requires; - - for(ComponentList::iterator i=components.begin(); i!=components.end(); ++i) - { - const PackageList &reqs = i->get_requires(); - requires.insert(requires.end(), reqs.begin(), reqs.end()); - } - for(PackageList::iterator i=requires.begin(); i!=requires.end(); ++i) { BinaryPackage *bpkg = dynamic_cast(*i); @@ -123,6 +115,13 @@ void SourcePackage::do_configure(const StringMap &opts, unsigned flag) } deps_cache.load(); + + for(ComponentList::iterator i=components.begin(); i!=components.end(); ++i) + { + const PackageList &reqs = i->get_requires(); + for(PackageList::const_iterator j=reqs.begin(); j!=reqs.end(); ++j) + (*j)->configure(opts, flag&2); + } } void SourcePackage::init_config() @@ -150,16 +149,6 @@ void SourcePackage::create_build_info() { build_info.add(builder.get_current_arch().get_build_info()); - for(PackageList::iterator i=base_reqs.begin(); i!=base_reqs.end(); ++i) - { - const BuildInfo &ebi = (*i)->get_exported_binfo(); - build_info.add(ebi); - - export_binfo.cflags.insert(export_binfo.cflags.end(), ebi.cflags.begin(), ebi.cflags.end()); - export_binfo.incpath.insert(export_binfo.incpath.end(), ebi.incpath.begin(), ebi.incpath.end()); - export_binfo.defines.insert(export_binfo.defines.end(), ebi.defines.begin(), ebi.defines.end()); - } - // XXX Currently, a package-specific settings will override cmdline. This might or might not be desirable. const StringList &warnings = builder.get_warnings(); build_info.warnings.insert(build_info.warnings.begin(), warnings.begin(), warnings.end()); diff --git a/source/sourcepackage.h b/source/sourcepackage.h index 883bbf6..e170399 100644 --- a/source/sourcepackage.h +++ b/source/sourcepackage.h @@ -54,13 +54,11 @@ private: std::string description; Msp::FS::Path source; - PackageList base_reqs; FeatureList features; BuildInfo build_info; ConditionList conditions; ComponentList components; Config config; - bool conf_done; mutable DependencyCache deps_cache; public: