2
0
Эх сурвалжийг харах

Merge pull request #5876 from ThomasWaldmann/find-libc-1.1

implement BORG_LIBC env variable, fixes #5870
TW 4 жил өмнө
parent
commit
40bd891aef

+ 5 - 0
docs/usage/general/environment.rst.inc

@@ -68,6 +68,11 @@ General:
         When set to no (default: yes), system information (like OS, Python version, ...) in
         When set to no (default: yes), system information (like OS, Python version, ...) in
         exceptions is not shown.
         exceptions is not shown.
         Please only use for good reasons as it makes issues harder to analyze.
         Please only use for good reasons as it makes issues harder to analyze.
+    BORG_LIBC
+        borg uses ``ctypes.util.find_library`` to locate the 'c' library (aka libc).
+        find_library needs a shell and will invoke some tools like ldconfig, gcc/cc or objdump.
+        If a shell or these tools are not available, you can give the name of your libc via
+        BORG_LIBC=libc.so.6 (for example) and borg will not try the ``find_library`` call.
     BORG_SELFTEST
     BORG_SELFTEST
         This can be used to influence borg's builtin self-tests. The default is to execute the tests
         This can be used to influence borg's builtin self-tests. The default is to execute the tests
         at the beginning of each borg command invocation.
         at the beginning of each borg command invocation.

+ 8 - 8
src/borg/xattr.py

@@ -62,21 +62,22 @@ def get_all(path, follow_symlinks=True):
             return {}
             return {}
 
 
 
 
-libc_name = find_library('c')
+HINT_MSG = "Try installing ldconfig, gcc/cc or objdump or use BORG_LIBC."
+LIBC_NOT_FOUND_NO_FALLBACK_MSG = "Can't find C library. No fallback known. " + HINT_MSG
+LIBC_NOT_FOUND_FNAME_MSG = "Can't find C library [%s]. " + HINT_MSG
+
+libc_name = os.environ.get('BORG_LIBC') or find_library('c')
 if libc_name is None:
 if libc_name is None:
     # find_library didn't work, maybe we are on some minimal system that misses essential
     # find_library didn't work, maybe we are on some minimal system that misses essential
     # tools used by find_library, like ldconfig, gcc/cc, objdump.
     # tools used by find_library, like ldconfig, gcc/cc, objdump.
     # so we can only try some "usual" names for the C library:
     # so we can only try some "usual" names for the C library:
     if sys.platform.startswith('linux'):
     if sys.platform.startswith('linux'):
         libc_name = 'libc.so.6'
         libc_name = 'libc.so.6'
-    elif sys.platform.startswith(('freebsd', 'netbsd')):
-        libc_name = 'libc.so'
     elif sys.platform == 'darwin':
     elif sys.platform == 'darwin':
         libc_name = 'libc.dylib'
         libc_name = 'libc.dylib'
     else:
     else:
-        msg = "Can't find C library. No fallback known. Try installing ldconfig, gcc/cc or objdump."
-        print(msg, file=sys.stderr)  # logger isn't initialized at this stage
-        raise Exception(msg)
+        print(LIBC_NOT_FOUND_NO_FALLBACK_MSG, file=sys.stderr)  # logger isn't initialized at this stage
+        raise Exception(LIBC_NOT_FOUND_NO_FALLBACK_MSG)
 
 
 # If we are running with fakeroot on Linux, then use the xattr functions of fakeroot. This is needed by
 # If we are running with fakeroot on Linux, then use the xattr functions of fakeroot. This is needed by
 # the 'test_extract_capabilities' test, but also allows xattrs to work with fakeroot on Linux in normal use.
 # the 'test_extract_capabilities' test, but also allows xattrs to work with fakeroot on Linux in normal use.
@@ -102,8 +103,7 @@ if sys.platform.startswith('linux'):
 try:
 try:
     libc = CDLL(libc_name, use_errno=True)
     libc = CDLL(libc_name, use_errno=True)
 except OSError as e:
 except OSError as e:
-    msg = "Can't find C library [%s]. Try installing ldconfig, gcc/cc or objdump." % e
-    raise Exception(msg)
+    raise Exception(LIBC_NOT_FOUND_FNAME_MSG % e)
 
 
 
 
 def split_string0(buf):
 def split_string0(buf):