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) ||
+ 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);
+ if(!locate_files())
+ return;
+
+ /* Add default entries to paths if they're empty and the package was found
+ in a non-system location */
+ if(!found_on_system && export_binfo.incpath.empty())
+ export_binfo.incpath.push_back(base_path/"include");
+ if(!found_on_system && export_binfo.libpath.empty())
+ export_binfo.libpath.push_back(base_path/"lib");
+
+ if(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, found_on_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);
+ }
+ }
+}
+
+bool BinaryPackage::locate_files()
+{
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()))
+ if(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;
unsigned least_missing = numeric_limits<unsigned>::max();
string missing_name;
for(const FS::Path &b: bases)
{
FS::Path prefix = b;
- system = prefix.empty();
+ bool system = prefix.empty();
if(system)
{
prefix = "/usr";
if(!missing_count)
{
base_path = prefix;
+ found_on_system = system;
builder.get_logger().log("configure", "%s found in %s", name, ((system && use_pkgconfig) ? "system" : base_path.str()));
break;
}
string missing_descr = (least_missing>1 ? format("%s and %d other files", missing_name, least_missing-1) : missing_name);
builder.get_logger().log("problems", "Cannot locate %s for %s", missing_descr, name);
problems.push_back(format("Cannot locate %s", missing_descr));
- 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;
+ return false;
}
- 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);
- }
- }
+ return true;
}