X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinarypackage.cpp;h=5415f257ef180cf17953e525123a9119e5168a03;hb=HEAD;hp=c0d688afdbb45532f7368d0d2bbb8065ac34301e;hpb=3938f8030b1f62802decce19777ce70fdafaff10;p=builder.git diff --git a/source/binarypackage.cpp b/source/binarypackage.cpp deleted file mode 100644 index c0d688a..0000000 --- a/source/binarypackage.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include -#include -#include -#include "binarypackage.h" -#include "builder.h" -#include "filetarget.h" -#include "staticlibrary.h" - -using namespace std; -using namespace Msp; - -BinaryPackage::BinaryPackage(Builder &b, const string &n): - Package(b, n) -{ - use_pkgconfig = false; -} - -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; - - process_flags(flags, pkg->export_binfo); - - Flags exclusive_static_flags; - for(const string &f: static_flags) - if(!any_equals(flags, f)) - exclusive_static_flags.push_back(f); - process_flags(exclusive_static_flags, pkg->static_binfo); - - return pkg; -} - -void BinaryPackage::process_flags(const Flags &flags, BuildInfo &binfo) -{ - for(const string &f: flags) - { - if(!f.compare(0, 2, "-I")) - binfo.incpath.push_back(f.substr(2)); - else if(!f.compare(0, 2, "-D")) - { - string::size_type equals = f.find('='); - if(equals!=string::npos) - binfo.defines[f.substr(2, equals-2)] = f.substr(equals+1); - else - binfo.defines[f.substr(2)] = string(); - } - else if(!f.compare(0, 2, "-L")) - binfo.libpath.push_back(f.substr(2)); - else if(!f.compare(0, 2, "-l")) - binfo.libs.push_back(f.substr(2)); - else if(f=="-pthread") - binfo.threads = true; - } -} - -void BinaryPackage::do_prepare() -{ - auto is_relative = [](const FS::Path &p){ return !p.is_absolute(); }; - bool has_relative_paths = any_of(export_binfo.libpath.begin(), export_binfo.libpath.end(), is_relative) || - any_of(export_binfo.incpath.begin(), export_binfo.incpath.end(), is_relative); - - 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() && export_binfo.incpath.empty())) - bases.push_back(builder.get_prefix()); - - // Always look in system locations - bases.push_back(FS::Path()); - - bool system = false; - for(const FS::Path &b: bases) - { - FS::Path prefix = b; - system = prefix.empty(); - if(system) - { - prefix = "/usr"; - const Architecture &arch = builder.get_current_arch(); - if(arch.is_cross()) - prefix /= arch.get_cross_prefix(); - } - - VirtualFileSystem::SearchPath libpath = export_binfo.libpath; - if(!system && libpath.empty()) - libpath.push_back("lib"); - for(FS::Path &p: libpath) - p = prefix/p; - - bool all_found = true; - for(const string &l: export_binfo.libs) - all_found &= (builder.get_vfs().find_library(l, libpath, export_binfo.libmode, system)!=0); - - VirtualFileSystem::SearchPath incpath = export_binfo.incpath; - if(!system && incpath.empty()) - incpath.push_back("include"); - for(FS::Path &p: incpath) - p = prefix/p; - - for(const string &h: headers) - all_found &= (builder.get_vfs().find_header(h, 0, incpath, system)!=0); - - if(all_found) - { - base_path = prefix; - builder.get_logger().log("configure", format("%s found in %s", name, ((system && use_pkgconfig) ? "system" : base_path.str()))); - break; - } - } - - if(base_path.empty()) - { - // 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; - } - - /* Add default entries to paths if they're empty and the package was found - in a non-system location */ - if(!system && export_binfo.incpath.empty()) - export_binfo.incpath.push_back(base_path/"include"); - if(!system && export_binfo.libpath.empty()) - export_binfo.libpath.push_back(base_path/"lib"); - - if(has_relative_paths) - { - for(FS::Path &p: export_binfo.incpath) - p = base_path/p; - for(FS::Path &p: export_binfo.libpath) - p = base_path/p; - } - - if(!static_binfo.libs.empty()) - { - VirtualFileSystem::SearchPath combined_libpath = static_binfo.libpath; - combined_libpath.insert(combined_libpath.end(), export_binfo.libpath.begin(), export_binfo.libpath.end()); - - for(const string &l: export_binfo.libs) - if(Target *lib = builder.get_vfs().find_library(l, export_binfo.libpath, BuildInfo::FORCE_STATIC, system)) - if(StaticLibrary *stlib = dynamic_cast(lib)) - { - for(const string &s: static_binfo.libs) - stlib->add_required_library(s); - for(const FS::Path &p: combined_libpath) - stlib->add_library_path(p); - } - } -} - - -BinaryPackage::Loader::Loader(BinaryPackage &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); -}