patch_wheel.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/env python3
  2. # Copyright 2023 Xiaomi Corp. (authors: Fangjun Kuang)
  3. import argparse
  4. import glob
  5. import shutil
  6. import subprocess
  7. import sys
  8. from pathlib import Path
  9. def get_args():
  10. parser = argparse.ArgumentParser()
  11. parser.add_argument(
  12. "--in-dir",
  13. type=Path,
  14. required=True,
  15. help="Input directory.",
  16. )
  17. parser.add_argument(
  18. "--out-dir",
  19. type=Path,
  20. required=True,
  21. help="Output directory.",
  22. )
  23. return parser.parse_args()
  24. def process(out_dir: Path, whl: Path):
  25. tmp_dir = out_dir / "tmp"
  26. subprocess.check_call(f"unzip {whl} -d {tmp_dir}", shell=True)
  27. if "cp37" in str(whl):
  28. py_version = "3.7"
  29. elif "cp38" in str(whl):
  30. py_version = "3.8"
  31. elif "cp39" in str(whl):
  32. py_version = "3.9"
  33. elif "cp310" in str(whl):
  34. py_version = "3.10"
  35. elif "cp311" in str(whl):
  36. py_version = "3.11"
  37. else:
  38. py_version = "3.12"
  39. rpath_list = [
  40. f"$ORIGIN/../lib/python{py_version}/site-packages/sherpa_ncnn/lib",
  41. f"$ORIGIN/../lib/python{py_version}/dist-packages/sherpa_ncnn/lib",
  42. #
  43. f"$ORIGIN/../lib/python{py_version}/site-packages/sherpa_ncnn/lib64",
  44. f"$ORIGIN/../lib/python{py_version}/dist-packages/sherpa_ncnn/lib64",
  45. #
  46. f"$ORIGIN/../lib/python{py_version}/site-packages/sherpa_ncnn.libs",
  47. ]
  48. rpaths = ":".join(rpath_list)
  49. for filename in glob.glob(
  50. f"{tmp_dir}/sherpa_ncnn-*data/data/bin/*", recursive=True
  51. ):
  52. print(filename)
  53. existing_rpath = (
  54. subprocess.check_output(["patchelf", "--print-rpath", filename])
  55. .decode()
  56. .strip()
  57. )
  58. target_rpaths = rpaths + ":" + existing_rpath
  59. subprocess.check_call(
  60. f"patchelf --force-rpath --set-rpath '{target_rpaths}' {filename}",
  61. shell=True,
  62. )
  63. outwheel = Path(shutil.make_archive(whl, "zip", tmp_dir))
  64. Path(outwheel).rename(out_dir / whl.name)
  65. shutil.rmtree(tmp_dir)
  66. def main():
  67. args = get_args()
  68. print(args)
  69. in_dir = args.in_dir
  70. out_dir = args.out_dir
  71. out_dir.mkdir(exist_ok=True, parents=True)
  72. for whl in in_dir.glob("*.whl"):
  73. process(out_dir, whl)
  74. if __name__ == "__main__":
  75. main()