+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);
+
+ vector<FS::Path> 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<StaticLibrary *>(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);
+ }
+ }