mirror of
https://github.com/Kitware/CMake.git
synced 2026-03-13 12:59:55 -05:00
file: Update GET_RUNTIME_DEPENDENCIES for macOS 11 dylib cache
Starting on macOS 11, the dynamic loader has a builtin cache of system-provided dylib files. They do not actually exist on the filesystem. However, runtime dependencies recorded in Mach-O binaries can still have `LC_LOAD_DYLIB` entries referring to such dylib files by absolute path. The dynamic loader simply resolves the paths from its cache. Teach `file(GET_RUNTIME_DEPENDENCIES)` to skip dependencies on such dylib paths. For practical software distribution purposes they do not exist, or at least can be assumed available on all deployments. Issue: #20863
This commit is contained in:
@@ -14,6 +14,18 @@
|
|||||||
#include "cmStringAlgorithms.h"
|
#include "cmStringAlgorithms.h"
|
||||||
#include "cmSystemTools.h"
|
#include "cmSystemTools.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
bool IsMissingSystemDylib(std::string const& path)
|
||||||
|
{
|
||||||
|
// Starting on macOS 11, the dynamic loader has a builtin cache of
|
||||||
|
// system-provided dylib files that do not exist on the filesystem.
|
||||||
|
// Tell our caller that these are expected to be missing.
|
||||||
|
return ((cmHasLiteralPrefix(path, "/System/Library/") ||
|
||||||
|
cmHasLiteralPrefix(path, "/usr/lib/")) &&
|
||||||
|
!cmSystemTools::PathExists(path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cmBinUtilsMacOSMachOLinker::cmBinUtilsMacOSMachOLinker(
|
cmBinUtilsMacOSMachOLinker::cmBinUtilsMacOSMachOLinker(
|
||||||
cmRuntimeDependencyArchive* archive)
|
cmRuntimeDependencyArchive* archive)
|
||||||
: cmBinUtilsLinker(archive)
|
: cmBinUtilsLinker(archive)
|
||||||
@@ -82,7 +94,8 @@ bool cmBinUtilsMacOSMachOLinker::GetFileDependencies(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (resolved) {
|
if (resolved) {
|
||||||
if (!this->Archive->IsPostExcluded(path)) {
|
if (!this->Archive->IsPostExcluded(path) &&
|
||||||
|
!IsMissingSystemDylib(path)) {
|
||||||
auto filename = cmSystemTools::GetFilenameName(path);
|
auto filename = cmSystemTools::GetFilenameName(path);
|
||||||
bool unique;
|
bool unique;
|
||||||
this->Archive->AddResolvedPath(filename, path, unique);
|
this->Archive->AddResolvedPath(filename, path, unique);
|
||||||
|
|||||||
Reference in New Issue
Block a user