From 7b3eea9481991425286feb7a53ab420e6e6c13a2 Mon Sep 17 00:00:00 2001 From: ras0219 <533828+ras0219@users.noreply.github.com> Date: Mon, 13 Jul 2020 12:07:52 -0700 Subject: [PATCH] [vcpkg] Add CMake heuristics for header-only libraries (#12386) * [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 Co-authored-by: Robert Schumacher Co-authored-by: nicole mazzuca --- toolsrc/src/vcpkg/install.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp index 7c0107264..0767a1bc7 100644 --- a/toolsrc/src/vcpkg/install.cpp +++ b/toolsrc/src/vcpkg/install.cpp @@ -578,6 +578,8 @@ namespace vcpkg::Install { std::map config_files; std::map> library_targets; + bool is_header_only = true; + std::string header_path; for (auto&& suffix : *p_lines) { @@ -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 {