X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinarypackage.cpp;h=aa1aed3c2fce4a0ecbfc7214299621724df27fdf;hb=92d81529ec8f3b84f5471162d0b27914eff7adb5;hp=7e2435a4a6fce6b138d3f319f40069ecf4bafb40;hpb=b8407de928d2c5421c35474df1c3185fd494ef68;p=builder.git diff --git a/source/binarypackage.cpp b/source/binarypackage.cpp index 7e2435a..aa1aed3 100644 --- a/source/binarypackage.cpp +++ b/source/binarypackage.cpp @@ -1,7 +1,10 @@ +#include #include #include #include "binarypackage.h" #include "builder.h" +#include "filetarget.h" +#include "staticlibrary.h" using namespace std; using namespace Msp; @@ -17,12 +20,14 @@ void BinaryPackage::do_prepare() bool has_relative_paths = false; for(BuildInfo::PathList::const_iterator i=export_binfo.libpath.begin(); (!has_relative_paths && i!=export_binfo.libpath.end()); ++i) has_relative_paths = !i->is_absolute(); + for(BuildInfo::PathList::const_iterator i=export_binfo.incpath.begin(); (!has_relative_paths && i!=export_binfo.incpath.end()); ++i) + has_relative_paths = !i->is_absolute(); list bases; /* If we have any relative paths that need resolving, or we have no paths at all and are not using pkg-config, look for files in prefix */ - if(has_relative_paths || (!use_pkgconfig && export_binfo.libpath.empty())) + if(has_relative_paths || (!use_pkgconfig && export_binfo.libpath.empty() && export_binfo.incpath.empty())) bases.push_back(builder.get_prefix()); // Always look in system locations @@ -51,6 +56,15 @@ void BinaryPackage::do_prepare() for(BuildInfo::WordList::const_iterator j=export_binfo.libs.begin(); j!=export_binfo.libs.end(); ++j) all_found &= (builder.get_vfs().find_library(*j, libpath, export_binfo.libmode, system)!=0); + BuildInfo::PathList incpath = export_binfo.incpath; + if(!system && incpath.empty()) + incpath.push_back("include"); + for(BuildInfo::PathList::iterator j=incpath.begin(); j!=incpath.end(); ++j) + *j = prefix/ *j; + + for(HeaderList::const_iterator j=headers.begin(); j!=headers.end(); ++j) + all_found &= (builder.get_vfs().find_header(*j, 0, incpath, system)!=0); + if(all_found) { base_path = prefix; @@ -61,7 +75,9 @@ void BinaryPackage::do_prepare() if(base_path.empty()) { - builder.problem(name, "Cannot locate files"); + // TODO report which files were not found + builder.get_logger().log("problems", format("Cannot locate files for %s", name)); + problems.push_back("Cannot locate files"); return; } @@ -72,19 +88,50 @@ void BinaryPackage::do_prepare() if(!system && export_binfo.libpath.empty()) export_binfo.libpath.push_back(base_path/"lib"); - for(BuildInfo::PathList::iterator i=export_binfo.incpath.begin(); i!=export_binfo.incpath.end(); ++i) - *i = base_path/ *i; - for(BuildInfo::PathList::iterator i=export_binfo.libpath.begin(); i!=export_binfo.libpath.end(); ++i) - *i = base_path/ *i; + if(has_relative_paths) + { + for(BuildInfo::PathList::iterator i=export_binfo.incpath.begin(); i!=export_binfo.incpath.end(); ++i) + *i = base_path/ *i; + for(BuildInfo::PathList::iterator i=export_binfo.libpath.begin(); i!=export_binfo.libpath.end(); ++i) + *i = base_path/ *i; + } + + if(!static_binfo.libs.empty()) + { + BuildInfo::PathList combined_libpath = static_binfo.libpath; + combined_libpath.insert(combined_libpath.end(), export_binfo.libpath.begin(), export_binfo.libpath.end()); + + for(BuildInfo::WordList::const_iterator i=export_binfo.libs.begin(); i!=export_binfo.libs.end(); ++i) + if(Target *lib = builder.get_vfs().find_library(*i, export_binfo.libpath, BuildInfo::FORCE_STATIC, system)) + if(StaticLibrary *stlib = dynamic_cast(lib)) + { + for(BuildInfo::WordList::const_iterator j=static_binfo.libs.begin(); j!=static_binfo.libs.end(); ++j) + stlib->add_required_library(*j); + for(BuildInfo::PathList::const_iterator j=combined_libpath.begin(); j!=combined_libpath.end(); ++j) + stlib->add_library_path(*j); + } + } } -BinaryPackage *BinaryPackage::from_flags(Builder &builder, const string &name, const vector &flags) +BinaryPackage *BinaryPackage::from_flags(Builder &builder, const string &name, const Flags &flags, const Flags &static_flags) { BinaryPackage *pkg = new BinaryPackage(builder, name); pkg->use_pkgconfig = true; - BuildInfo &binfo = pkg->export_binfo; - for(vector::const_iterator i=flags.begin(); i!=flags.end(); ++i) + process_flags(flags, pkg->export_binfo); + + Flags exclusive_static_flags; + for(Flags::const_iterator i=static_flags.begin(); i!=static_flags.end(); ++i) + if(find(flags.begin(), flags.end(), *i)==flags.end()) + exclusive_static_flags.push_back(*i); + process_flags(exclusive_static_flags, pkg->static_binfo); + + return pkg; +} + +void BinaryPackage::process_flags(const Flags &flags, BuildInfo &binfo) +{ + for(Flags::const_iterator i=flags.begin(); i!=flags.end(); ++i) { if(!i->compare(0, 2, "-I")) binfo.incpath.push_back(i->substr(2)); @@ -103,18 +150,22 @@ BinaryPackage *BinaryPackage::from_flags(Builder &builder, const string &name, c else if(*i=="-pthread") binfo.threads = true; } - - return pkg; } BinaryPackage::Loader::Loader(BinaryPackage &p): - DataFile::DerivedObjectLoader(p) + DataFile::DerivedObjectLoader(p) { add("build_info", &Loader::build_info); + add("header", &Loader::header); } void BinaryPackage::Loader::build_info() { load_sub(obj.export_binfo); } + +void BinaryPackage::Loader::header(const string &h) +{ + obj.headers.push_back(h); +}