| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* 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 "cmMakefile.h"
- #include "cmRuntimeDependencyArchive.h"
- #include "cmStringAlgorithms.h"
- #include "cmSystemTools.h"
- #include "cmUVProcessChain.h"
- #include "cmsys/RegularExpression.hxx"
- #include <istream>
- #include <string>
- #include <vector>
- 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;
- cmExpandList(ldConfigPath, ldConfigCommand);
- 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;
- }
|