build: add script for automatically downloading packages
This commit is contained in:
parent
3788bee966
commit
ab0673611d
214
src/download_packages.sh
Executable file
214
src/download_packages.sh
Executable file
@ -0,0 +1,214 @@
|
||||
#!/bin/bash
|
||||
|
||||
# List of package URLs to download
|
||||
PACKAGE_URLS=(
|
||||
"https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz"
|
||||
"https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz"
|
||||
"https://www.mpfr.org/mpfr-current/mpfr-4.2.1.tar.xz"
|
||||
"https://ftp.gnu.org/gnu/gdb/gdb-15.1.tar.xz"
|
||||
)
|
||||
|
||||
function unpack_tarball() {
|
||||
# Unpack a tarball based on its extension.
|
||||
# Supported extensions: tar, gz, xz.
|
||||
#
|
||||
# Parameters:
|
||||
# $1: tarball
|
||||
#
|
||||
# Returns:
|
||||
# 0: success
|
||||
# 1: failure
|
||||
|
||||
local tarball="$1"
|
||||
local extension="${tarball##*.}"
|
||||
|
||||
if [[ ! -f "$tarball" ]]; then
|
||||
>&2 echo "Error: $tarball does not exist"
|
||||
return 1
|
||||
fi
|
||||
|
||||
case "$extension" in
|
||||
tar | xz)
|
||||
tar xf "$tarball"
|
||||
;;
|
||||
gz)
|
||||
tar xzf "$tarball"
|
||||
;;
|
||||
*)
|
||||
>&2 echo "Error: unknown extension $extension"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
>&2 echo "Error: failed to unpack $tarball"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function download_package() {
|
||||
# Download a package. Will skip download if the output file already exists.
|
||||
#
|
||||
# Parameters:
|
||||
# $1: URL of the package
|
||||
# $2: output file
|
||||
#
|
||||
# Returns:
|
||||
# 0: success
|
||||
# 1: failure
|
||||
|
||||
local url="$1"
|
||||
local output="$2"
|
||||
|
||||
if [[ -f "$output" ]]; then
|
||||
>&2 echo "Skipping download: $output already exists"
|
||||
return 0
|
||||
fi
|
||||
|
||||
wget "$url" -O "$output"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
>&2 echo "Error: failed to download $url"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function extract_package() {
|
||||
# Extract a package. Will skip extraction if the package directory already exists.
|
||||
#
|
||||
# Parameters:
|
||||
# $1: package tarball
|
||||
# $2: output directory
|
||||
#
|
||||
# Returns:
|
||||
# 0: success
|
||||
# 1: failure
|
||||
|
||||
local tarball="$1"
|
||||
local output_dir="$2"
|
||||
local package_dir="${tarball%.tar*}"
|
||||
local tarball_realpath="$(realpath "$tarball")"
|
||||
local temp_dir="$(mktemp -d)"
|
||||
|
||||
if [[ ! -f "$tarball" ]]; then
|
||||
>&2 echo "Error: $tarball does not exist"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ -d "$output_dir" ]]; then
|
||||
>&2 echo "Skipping extraction: $output_dir already exists"
|
||||
return 0
|
||||
fi
|
||||
|
||||
pushd "$temp_dir" > /dev/null
|
||||
|
||||
unpack_tarball "$tarball_realpath"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
popd > /dev/null
|
||||
return 1
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
|
||||
mv "$temp_dir/$package_dir" "$output_dir"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
rm -rf "$temp_dir"
|
||||
}
|
||||
|
||||
function download_and_extract_package() {
|
||||
# Download and extract a package.
|
||||
#
|
||||
# Parameters:
|
||||
# $1: URL of the package
|
||||
# $2: output directory
|
||||
#
|
||||
# Returns:
|
||||
# 0: success
|
||||
# 1: failure
|
||||
|
||||
local url="$1"
|
||||
local output_dir="$2"
|
||||
local tarball=$(basename "$url")
|
||||
|
||||
download_package "$url" "$tarball"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
extract_package "$tarball" "$output_dir"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function package_url_to_dir() {
|
||||
# Convert a package URL to a directory name.
|
||||
#
|
||||
# Parameters:
|
||||
# $1: package URL
|
||||
#
|
||||
# Echoes:
|
||||
# The package directory name
|
||||
#
|
||||
# Returns:
|
||||
# 0: success
|
||||
# 1: failure
|
||||
|
||||
local url="$1"
|
||||
|
||||
# The name of the package is the basename of the URL without the version number.
|
||||
local package_dir=$(basename "$url")
|
||||
package_dir="${package_dir%%-*}"
|
||||
|
||||
echo "$package_dir"
|
||||
}
|
||||
|
||||
function download_gdb_packages() {
|
||||
# Download and extract all required packages for building GDB.
|
||||
#
|
||||
# Parameters:
|
||||
# $1: packages directory
|
||||
#
|
||||
# Returns:
|
||||
# 0: success
|
||||
# 1: failure
|
||||
|
||||
local packages_dir="$1"
|
||||
pushd "$packages_dir"
|
||||
|
||||
# Run downloads in parallel
|
||||
download_pids=()
|
||||
|
||||
for url in "${PACKAGE_URLS[@]}"; do
|
||||
package_dir=$(package_url_to_dir "$url")
|
||||
download_and_extract_package "$url" "$package_dir" &
|
||||
download_pids+=($!)
|
||||
done
|
||||
|
||||
for pid in "${download_pids[@]}"; do
|
||||
wait "$pid"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
popd
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
popd
|
||||
}
|
||||
|
||||
function main() {
|
||||
if [[ $# -ne 1 ]]; then
|
||||
>&2 echo "Usage: $0 <packages_dir>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
download_gdb_packages "$1"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
>&2 echo "Error: failed to download GDB packages"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
Loading…
x
Reference in New Issue
Block a user