Skip to content

Commit

Permalink
[vcpkg] Add CMake heuristics for header-only libraries (#12386)
Browse files Browse the repository at this point in the history
* [vcpkg] Add CMake heuristics for header-only libraries

* [vcpkg] Update toolsrc/src/vcpkg/install.cpp

Handles the case of:
```
triplet/lib/
triplet/lib/x.pc
```

Co-authored-by: nicole mazzuca <mazzucan@outlook.com>

Co-authored-by: Robert Schumacher <roschuma@microsoft.com>
Co-authored-by: nicole mazzuca <mazzucan@outlook.com>
  • Loading branch information
3 people authored Jul 13, 2020
1 parent 52a9d9a commit 7b3eea9
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions toolsrc/src/vcpkg/install.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,8 @@ namespace vcpkg::Install
{
std::map<std::string, std::string> config_files;
std::map<std::string, std::vector<std::string>> library_targets;
bool is_header_only = true;
std::string header_path;

for (auto&& suffix : *p_lines)
{
Expand Down Expand Up @@ -617,10 +619,42 @@ namespace vcpkg::Install
config_files[find_package_name] = root;
}
}
if (Strings::case_insensitive_ascii_contains(suffix, "/lib/") ||
Strings::case_insensitive_ascii_contains(suffix, "/bin/"))
{
if (!Strings::ends_with(suffix, ".pc") && !Strings::ends_with(suffix, "/")) is_header_only = false;
}

if (is_header_only && header_path.empty())
{
auto it = suffix.find("/include/");
if (it != std::string::npos && !Strings::ends_with(suffix, "/"))
{
header_path = suffix.substr(it + 9);
}
}
}

if (library_targets.empty())
{
if (is_header_only && !header_path.empty())
{
static auto cmakeify = [](std::string name) {
auto n = Strings::ascii_to_uppercase(Strings::replace_all(std::move(name), "-", "_"));
if (n.empty() || Parse::ParserBase::is_ascii_digit(n[0]))
{
n.insert(n.begin(), '_');
}
return n;
};

const auto name = cmakeify(bpgh.spec.name());
auto msg = Strings::concat(
"The package ", bpgh.spec, " is header only and can be used from CMake via:\n\n");
Strings::append(msg, " find_path(", name, "_INCLUDE_DIRS \"", header_path, "\")\n");
Strings::append(msg, " target_include_directories(main PRIVATE ${", name, "_INCLUDE_DIRS})\n\n");
System::print2(msg);
}
}
else
{
Expand Down

0 comments on commit 7b3eea9

Please sign in to comment.