mirror of
https://github.com/squidfunk/mkdocs-material.git
synced 2024-11-30 18:24:35 +01:00
a2cb35d4c5
* fix(social): CairoSVG OSError handling in social plugin Related issue: #6817 Co-authored-by: Guts <1596222+Guts@users.noreply.github.com> * feat(docs): Add troubleshooting guide for CairoSVG crash --------- Co-authored-by: Kamil Krzyśków <kamilzary@gmail.com> Co-authored-by: Guts <1596222+Guts@users.noreply.github.com> Co-authored-by: Martin Donath <martin.donath@squidfunk.com>
112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
import inspect
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
from ctypes import util
|
|
|
|
|
|
class CustomPopen(subprocess.Popen):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
print(f"Subprocess command:\n {' '.join(args[0])}")
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def communicate(self, *args, **kwargs):
|
|
out, _ = super().communicate(*args, **kwargs)
|
|
out = out.rstrip()
|
|
print("Subprocess output:")
|
|
if out:
|
|
print(f" {os.fsdecode(out)}")
|
|
else:
|
|
print(f" Output is empty")
|
|
return out, _
|
|
|
|
def __getattribute__(self, name_):
|
|
att = super().__getattribute__(name_)
|
|
if name_ == "stdout" and att is not None:
|
|
att.read = self.read_wrapper(att.read)
|
|
return att
|
|
|
|
@staticmethod
|
|
def read_wrapper(func):
|
|
|
|
if func.__name__ == "wrapper":
|
|
return func
|
|
|
|
def wrapper(*args, **kwargs):
|
|
output = func(*args, **kwargs)
|
|
print("Subprocess output:")
|
|
for line_ in os.fsdecode(output).split("\n"):
|
|
print(line_)
|
|
return output
|
|
|
|
return wrapper
|
|
|
|
|
|
subprocess.Popen = CustomPopen
|
|
|
|
print("ctypes.util script with the find_library:")
|
|
print(inspect.getsourcefile(util.find_library), end="\n\n")
|
|
|
|
print("find_library function:")
|
|
func_lines = list(map(str.rstrip, inspect.getsourcelines(util.find_library)[0]))
|
|
indent = len(func_lines[0]) - len(func_lines[0].lstrip())
|
|
for line in func_lines:
|
|
print(line.replace(" " * indent, "", 1))
|
|
|
|
library_names = ("cairo-2", "cairo", "libcairo-2")
|
|
filenames = ("libcairo.so.2", "libcairo.2.dylib", "libcairo-2.dll")
|
|
c_compiler = shutil.which("gcc") or shutil.which("cc")
|
|
ld_env = os.environ.get("LD_LIBRARY_PATH")
|
|
first_found = ""
|
|
|
|
print("\nLD_LIBRARY_PATH =", ld_env, end="\n\n")
|
|
|
|
for name in library_names:
|
|
if hasattr(util, "_findSoname_ldconfig"):
|
|
result = util._findSoname_ldconfig(name)
|
|
print(f"_findSoname_ldconfig({name}) ->", result)
|
|
if result:
|
|
print(f"Found {result}")
|
|
if not first_found:
|
|
first_found = result
|
|
print("---")
|
|
if c_compiler and hasattr(util, "_findLib_gcc"):
|
|
result = util._findLib_gcc(name)
|
|
print(f"_findLib_gcc({name}) ->", result)
|
|
if result and hasattr(util, "_get_soname"):
|
|
result = util._get_soname(result)
|
|
if result:
|
|
print(f"Found {result}")
|
|
if not first_found:
|
|
first_found = result
|
|
print("---")
|
|
if hasattr(util, "_findLib_ld"):
|
|
result = util._findLib_ld(name)
|
|
print(f"_findLib_ld({name}) ->", result)
|
|
if result and hasattr(util, "_get_soname"):
|
|
result = util._get_soname(result)
|
|
if result:
|
|
print(f"Found {result}")
|
|
if not first_found:
|
|
first_found = result
|
|
print("---")
|
|
if hasattr(util, "_findLib_crle"):
|
|
result = util._findLib_crle(name, False)
|
|
print(f"_findLib_crle({name}) ->", result)
|
|
if result and hasattr(util, "_get_soname"):
|
|
result = util._get_soname(result)
|
|
if result:
|
|
print(f"Found {result}")
|
|
if not first_found:
|
|
first_found = result
|
|
print("---")
|
|
|
|
if first_found:
|
|
filenames = (first_found,) + filenames
|
|
|
|
print(f"The path is {first_found or 'not found'}")
|
|
print("List of files that FFI will try to load:")
|
|
for filename in filenames:
|
|
print("-", filename)
|