Files
LibreELEC.tv/scripts/extract
Matthias Reichl 1c5d050bc0 scripts/extract: improve tar file handling
GNU tar can automatically detect the compression format based on
the file name since at least 2006. So just use "tar xf" to extract
all tarballs and drop the redundant cases.

GNU tar can also strip the top level directory from the archive
which allows us to extract it to the directory wanted by the
build system ($PKG_NAME-$PKG_VERSION), so packages don't need to
specify PKG_SOURCE_DIR if the top level dir from that and scripts/unpack
doesn't need to rename the directory.

If PKG_SOURCE_DIR is not set the top level dir is automatically
stripped from the archive and extracted to $BUILD/$PKG_NAME-$PKG_VERSION

If PKG_SOURCE_DIR is set, scripts/extract behaviour is unchanged.

Signed-off-by: Matthias Reichl <hias@horus.com>
2018-08-26 22:26:04 +02:00

74 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
. config/options $1
if [ -z "$2" ]; then
echo "usage: $0 package_name target_dir"
exit 1
fi
[ -z "$PKG_URL" -o -z "$PKG_SOURCE_NAME" ] && exit 1
[ ! -d "$SOURCES/$1" -o ! -d "$2" ] && exit 1
if [[ ${PKG_URL} =~ ^file:// ]]; then
FULL_SOURCE_PATH="$PKG_SOURCE_NAME"
else
FULL_SOURCE_PATH="$SOURCES/$1/$PKG_SOURCE_NAME"
fi
if [ ! -f "$FULL_SOURCE_PATH" -a ! -d "$FULL_SOURCE_PATH" ]; then
echo "error: File $PKG_SOURCE_NAME doesn't exist for package $1"
echo "Have you called scripts/extract before scripts/get ?"
exit 1
fi
# The build system expects packages to be extracted to
# $BUILD/$PKG_NAME-$PKG_VERSION.
# Try to strip the top level dir from the archive and extract to
# the correct directory if possible so packages don't need to
# set PKG_SOURCE_DIR and scripts/unpack doesn't need to rename
# the directory.
# Currently this is only supported for tar archives.
# If PKG_SOURCE_DIR is set don't apply any directory mangling
# so advanced renaming (eg stripping more than one directory level)
# can be performed by scripts/unpack.
if [ -z "$PKG_SOURCE_DIR" ]; then
TAR_OPTS="--strip-components=1"
DESTDIR="$2/$PKG_NAME-$PKG_VERSION"
else
TAR_OPTS=""
DESTDIR="$2"
fi
case $PKG_SOURCE_NAME in
*.tar | *.tar.bz2 | *.tbz | *.tar.gz | *.tgz | *.tar.xz | *.txz)
mkdir -p "$DESTDIR"
tar xf $FULL_SOURCE_PATH $TAR_OPTS -C "$DESTDIR"
;;
*.7z)
mkdir -p $2/$1
7z x -o$2/$1 $FULL_SOURCE_PATH
;;
*.zip)
unzip -q $FULL_SOURCE_PATH -d $2
;;
*.diff | *.patch)
cat $FULL_SOURCE_PATH | patch -d $2 -p1
;;
*.diff.bz2 | *.patch.bz2 | patch-*.bz2)
bzcat $FULL_SOURCE_PATH | patch -d $2 -p1
;;
*.diff.gz | *.patch.gz | patch-*.gz)
zcat $FULL_SOURCE_PATH | patch -d $2 -p1
;;
*)
FULL_DEST_PATH="$2/$PKG_NAME-$PKG_VERSION"
mkdir $FULL_DEST_PATH
tar cf - -C $FULL_SOURCE_PATH $PKG_TAR_COPY_OPTS . | \
tar xf - -C $FULL_DEST_PATH
;;
esac