Commit c5140003 authored by Brad King's avatar Brad King
Browse files

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
parent 6ab08c4e
......@@ -14,6 +14,18 @@
#include "cmStringAlgorithms.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(
cmRuntimeDependencyArchive* archive)
: cmBinUtilsLinker(archive)
......@@ -82,7 +94,8 @@ bool cmBinUtilsMacOSMachOLinker::GetFileDependencies(
return false;
}
if (resolved) {
if (!this->Archive->IsPostExcluded(path)) {
if (!this->Archive->IsPostExcluded(path) &&
!IsMissingSystemDylib(path)) {
auto filename = cmSystemTools::GetFilenameName(path);
bool unique;
this->Archive->AddResolvedPath(filename, path, unique);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment