1
0
mirror of https://github.com/facebook/proxygen.git synced 2025-08-05 19:55:47 +03:00

fixup-dyn-deps: handle duplicate dynamic library paths

Summary:
On GitHub Actions macos-10.15 image, some of the build dependencies
for Watchman reference
/usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib and others
reference
/usr/local/Cellar/openssl@1.1/1.1.1m/lib/libcrypto.1.1.dylib.

To avoid overwriting libcrypto in the artifact directory, key
processed_deps on the destination path.

Reviewed By: xavierd

Differential Revision: D34882663

fbshipit-source-id: 60d021bf9956d9b3e34e8945ccec234d31031369
This commit is contained in:
Chad Austin
2022-03-17 13:41:28 -07:00
committed by Facebook GitHub Bot
parent df26f96a73
commit a8609a821c

View File

@@ -7,12 +7,13 @@ import errno
import glob
import os
import re
import shlex
import shutil
import stat
import subprocess
import sys
from struct import unpack
from typing import Optional
from typing import List, Optional
from .envfuncs import path_search
@@ -31,6 +32,9 @@ class DepBase(object):
self.env = buildopts.compute_env_for_install_dirs(install_dirs)
self.install_dirs = install_dirs
self.strip = strip
# Deduplicates dependency processing. Keyed on the library
# destination path.
self.processed_deps = set()
def list_dynamic_deps(self, objfile):
@@ -102,12 +106,18 @@ class DepBase(object):
# Resolve this dep: does it exist in any of our installation
# directories? If so, then it is a candidate for processing
dep = self.resolve_loader_path(d)
print("dep: %s -> %s" % (d, dep))
if dep:
# pyre-fixme[16]: `DepBase` has no attribute `munged_lib_dir`.
dest_dep = os.path.join(self.munged_lib_dir, os.path.basename(dep))
if dep not in self.processed_deps:
self.processed_deps.add(dep)
print("dep: %s -> %s" % (d, dest_dep))
if dest_dep in self.processed_deps:
# A previous dependency with the same name has already
# been installed at dest_dep, so there is no need to copy
# or munge the dependency again.
# TODO: audit that both source paths have the same inode number
pass
else:
self.processed_deps.add(dest_dep)
copyfile(dep, dest_dep)
self.munge_in_place(dest_dep, final_lib_dir)
@@ -119,7 +129,7 @@ class DepBase(object):
def rewrite_dep(self, objfile, depname, old_dep, new_dep, final_lib_dir):
raise RuntimeError("rewrite_dep not implemented")
def resolve_loader_path(self, dep):
def resolve_loader_path(self, dep: str) -> Optional[str]:
if os.path.isabs(dep):
return dep
d = os.path.basename(dep)
@@ -153,6 +163,10 @@ class DepBase(object):
from an object file"""
pass
def check_call_verbose(self, args: List[str]) -> None:
print(" ".join(map(shlex.quote, args)))
subprocess.check_call(args)
class WinDeps(DepBase):
def __init__(self, buildopts, install_dirs, strip) -> None:
@@ -350,7 +364,7 @@ class ElfDeps(DepBase):
# pyre-fixme[16]: `ElfDeps` has no attribute `munged_lib_dir`.
os.path.relpath(new_dep, self.munged_lib_dir),
)
subprocess.check_call(
self.check_call_verbose(
[self.patchelf, "--replace-needed", depname, final_dep, objfile]
)
@@ -363,7 +377,7 @@ class ElfDeps(DepBase):
return magic == b"\x7fELF"
def strip_debug_info(self, objfile) -> None:
subprocess.check_call(["strip", objfile])
self.check_call_verbose(["strip", objfile])
# MACH-O magic number
@@ -412,7 +426,7 @@ class MachDeps(DepBase):
# Erase the original location from the id of the shared
# object. It doesn't appear to hurt to retain it, but
# it does look weird, so let's rewrite it to be sure.
subprocess.check_call(
self.check_call_verbose(
["install_name_tool", "-id", os.path.basename(objfile), objfile]
)
final_dep = os.path.join(
@@ -421,7 +435,7 @@ class MachDeps(DepBase):
os.path.relpath(new_dep, self.munged_lib_dir),
)
subprocess.check_call(
self.check_call_verbose(
["install_name_tool", "-change", depname, final_dep, objfile]
)