extract 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0-or-later
  3. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  4. # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
  5. . config/options "${1}"
  6. if [ -z "${2}" ]; then
  7. die "usage: ${0} package_name target_dir"
  8. fi
  9. [ -z "${PKG_URL}" -o -z "${PKG_SOURCE_NAME}" ] && die "${PKG_NAME}: PKG_URL or PKG_SOURCE_NAME undefined"
  10. [ ! -d "${SOURCES}/${1}" ] && die "${PKG_NAME}: ${SOURCES}/${1} not found"
  11. [ ! -d "${2}" ] && die "${PKG_NAME}: target ${2} not found"
  12. if [[ "${PKG_URL}" =~ ^file:// ]]; then
  13. FULL_SOURCE_PATH="${PKG_SOURCE_NAME}"
  14. else
  15. FULL_SOURCE_PATH="${SOURCES}/${1}/${PKG_SOURCE_NAME}"
  16. fi
  17. if [ ! -f "${FULL_SOURCE_PATH}" -a ! -d "${FULL_SOURCE_PATH}" ]; then
  18. echo "error: File ${PKG_SOURCE_NAME} doesn't exist for package ${1}"
  19. echo "Have you called scripts/extract before scripts/get?"
  20. die
  21. fi
  22. # The build system expects packages to be extracted to
  23. # ${PKG_BUILD}.
  24. # Try to strip the top level dir from the archive and extract to
  25. # the correct directory if possible so packages don't need to
  26. # set PKG_SOURCE_DIR and scripts/unpack doesn't need to rename
  27. # the directory.
  28. # Currently this is only supported for tar archives.
  29. # If PKG_SOURCE_DIR is set don't apply any directory mangling
  30. # so advanced renaming (eg stripping more than one directory level)
  31. # can be performed by scripts/unpack.
  32. # If the archive does not contain a top level folder the strip components
  33. # can be disabled by PKG_TAR_STRIP_COMPONENTS="no" in package.mk
  34. TAR_OPTS=""
  35. if [ -z "${PKG_SOURCE_DIR}" ]; then
  36. [ -z "${PKG_TAR_STRIP_COMPONENTS}" ] && TAR_OPTS="--strip-components=1" || :
  37. DESTDIR="${2}/${PKG_NAME}-${PKG_VERSION}"
  38. else
  39. DESTDIR="${2}"
  40. fi
  41. case "${PKG_SOURCE_NAME}" in
  42. *.tar | *.tar.bz2 | *.tbz | *.tar.gz | *.tgz | *.tar.xz | *.txz)
  43. mkdir -p "${DESTDIR}"
  44. tar xf "${FULL_SOURCE_PATH}" ${TAR_OPTS} -C "${DESTDIR}"
  45. ;;
  46. *.tar.zst | *.tzst)
  47. mkdir -p "${DESTDIR}"
  48. zstdcat "${FULL_SOURCE_PATH}" | tar xf - ${TAR_OPTS} -C "${DESTDIR}"
  49. ;;
  50. *.7z)
  51. mkdir -p "${2}/${1}"
  52. 7z x -o"${2}/${1}" "${FULL_SOURCE_PATH}"
  53. ;;
  54. *.zip)
  55. unzip -o -q "${FULL_SOURCE_PATH}" -d "${2}"
  56. ;;
  57. *.diff | *.patch)
  58. patch -d "${2}" -p1 < "${FULL_SOURCE_PATH}"
  59. ;;
  60. *.diff.bz2 | *.patch.bz2 | patch-*.bz2)
  61. bzcat "${FULL_SOURCE_PATH}" | patch -d "${2}" -p1
  62. ;;
  63. *.diff.gz | *.patch.gz | patch-*.gz)
  64. zcat "${FULL_SOURCE_PATH}" | patch -d "${2}" -p1
  65. ;;
  66. *)
  67. FULL_DEST_PATH="${2}/${PKG_NAME}-${PKG_VERSION}"
  68. mkdir "${FULL_DEST_PATH}"
  69. tar cf - -C "${FULL_SOURCE_PATH}" ${PKG_TAR_COPY_OPTS} . | tar xf - -C "${FULL_DEST_PATH}"
  70. ;;
  71. esac