| /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
 |    file Copyright.txt or https://cmake.org/licensing for details.  */ | 
 |  | 
 | #include "cmLDConfigLDConfigTool.h" | 
 |  | 
 | #include <istream> | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "cmsys/RegularExpression.hxx" | 
 |  | 
 | #include "cmMakefile.h" | 
 | #include "cmRuntimeDependencyArchive.h" | 
 | #include "cmStringAlgorithms.h" | 
 | #include "cmSystemTools.h" | 
 | #include "cmUVProcessChain.h" | 
 |  | 
 | cmLDConfigLDConfigTool::cmLDConfigLDConfigTool( | 
 |   cmRuntimeDependencyArchive* archive) | 
 |   : cmLDConfigTool(archive) | 
 | { | 
 | } | 
 |  | 
 | bool cmLDConfigLDConfigTool::GetLDConfigPaths(std::vector<std::string>& paths) | 
 | { | 
 |   std::string ldConfigPath = | 
 |     this->Archive->GetMakefile()->GetSafeDefinition("CMAKE_LDCONFIG_COMMAND"); | 
 |   if (ldConfigPath.empty()) { | 
 |     ldConfigPath = cmSystemTools::FindProgram( | 
 |       "ldconfig", { "/sbin", "/usr/sbin", "/usr/local/sbin" }); | 
 |     if (ldConfigPath.empty()) { | 
 |       this->Archive->SetError("Could not find ldconfig"); | 
 |       return false; | 
 |     } | 
 |   } | 
 |  | 
 |   std::vector<std::string> ldConfigCommand = cmExpandedList(ldConfigPath); | 
 |   ldConfigCommand.emplace_back("-v"); | 
 |   ldConfigCommand.emplace_back("-N"); // Don't rebuild the cache. | 
 |   ldConfigCommand.emplace_back("-X"); // Don't update links. | 
 |  | 
 |   cmUVProcessChainBuilder builder; | 
 |   builder.SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT) | 
 |     .AddCommand(ldConfigCommand); | 
 |   auto process = builder.Start(); | 
 |   if (!process.Valid()) { | 
 |     this->Archive->SetError("Failed to start ldconfig process"); | 
 |     return false; | 
 |   } | 
 |  | 
 |   std::string line; | 
 |   static const cmsys::RegularExpression regex("^([^\t:]*):"); | 
 |   while (std::getline(*process.OutputStream(), line)) { | 
 |     cmsys::RegularExpressionMatch match; | 
 |     if (regex.find(line.c_str(), match)) { | 
 |       paths.push_back(match.match(1)); | 
 |     } | 
 |   } | 
 |  | 
 |   if (!process.Wait()) { | 
 |     this->Archive->SetError("Failed to wait on ldconfig process"); | 
 |     return false; | 
 |   } | 
 |   auto status = process.GetStatus(); | 
 |   if (!status[0] || status[0]->ExitStatus != 0) { | 
 |     this->Archive->SetError("Failed to run ldconfig"); | 
 |     return false; | 
 |   } | 
 |  | 
 |   return true; | 
 | } |