build-bootstraps.sh: adding a way to generate bootstrap based on pacman
This commit is contained in:
parent
d46e3bc8a4
commit
e117fd3ec8
|
@ -26,8 +26,14 @@ BOOTSTRAP_ANDROID10_COMPATIBLE=false
|
||||||
TERMUX_DEFAULT_ARCHITECTURES=("aarch64" "arm" "i686" "x86_64")
|
TERMUX_DEFAULT_ARCHITECTURES=("aarch64" "arm" "i686" "x86_64")
|
||||||
TERMUX_ARCHITECTURES=("${TERMUX_DEFAULT_ARCHITECTURES[@]}")
|
TERMUX_ARCHITECTURES=("${TERMUX_DEFAULT_ARCHITECTURES[@]}")
|
||||||
|
|
||||||
|
# The supported termux package managers.
|
||||||
|
TERMUX_PACKAGE_MANAGERS=("apt" "pacman")
|
||||||
|
# The package manager that will be installed in bootstrap.
|
||||||
|
# The default is 'apt'. Can be changed by using the '--pm' option.
|
||||||
|
TERMUX_PACKAGE_MANAGER="apt"
|
||||||
|
|
||||||
TERMUX_PACKAGES_DIRECTORY="/home/builder/termux-packages"
|
TERMUX_PACKAGES_DIRECTORY="/home/builder/termux-packages"
|
||||||
TERMUX_BUILT_DEBS_DIRECTORY="$TERMUX_PACKAGES_DIRECTORY/output"
|
TERMUX_BUILT_PKGS_DIRECTORY="$TERMUX_PACKAGES_DIRECTORY/output"
|
||||||
TERMUX_BUILT_PACKAGES_DIRECTORY="/data/data/.built-packages"
|
TERMUX_BUILT_PACKAGES_DIRECTORY="/data/data/.built-packages"
|
||||||
|
|
||||||
IGNORE_BUILD_SCRIPT_NOT_FOUND_ERROR=1
|
IGNORE_BUILD_SCRIPT_NOT_FOUND_ERROR=1
|
||||||
|
@ -55,6 +61,22 @@ for cmd in ar awk curl grep gzip find sed tar xargs xz zip; do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# format a metadata entry (from command repo-add)
|
||||||
|
format_entry() {
|
||||||
|
local field=$1; shift
|
||||||
|
|
||||||
|
if [[ $1 ]]; then
|
||||||
|
printf '%%%s%%\n' "$field"
|
||||||
|
printf '%s\n' "$@"
|
||||||
|
printf '\n'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get info about package from file .PKGINFO for create desc file
|
||||||
|
get_info_pkg() {
|
||||||
|
echo "$(grep "^$1 " .PKGINFO | awk -F " = " '{printf $2 "\n"}')"
|
||||||
|
}
|
||||||
|
|
||||||
# Build deb files for package and its dependencies deb from source for arch
|
# Build deb files for package and its dependencies deb from source for arch
|
||||||
build_package() {
|
build_package() {
|
||||||
|
|
||||||
|
@ -62,6 +84,11 @@ build_package() {
|
||||||
|
|
||||||
local package_arch="$1"
|
local package_arch="$1"
|
||||||
local package_name="$2"
|
local package_name="$2"
|
||||||
|
if [ ! -d $TERMUX_PACKAGES_DIRECTORY/*packages/$package_name ]; then
|
||||||
|
local dir_subpackage=$(ls $TERMUX_PACKAGES_DIRECTORY/*packages/*/$package_name.subpackage.sh)
|
||||||
|
dir_subpackage=(${dir_subpackage//// })
|
||||||
|
package_name="${dir_subpackage[-2]}"
|
||||||
|
fi
|
||||||
|
|
||||||
local build_output
|
local build_output
|
||||||
|
|
||||||
|
@ -70,12 +97,12 @@ build_package() {
|
||||||
cd "$TERMUX_PACKAGES_DIRECTORY"
|
cd "$TERMUX_PACKAGES_DIRECTORY"
|
||||||
echo $'\n\n\n'"[*] Building '$package_name'..."
|
echo $'\n\n\n'"[*] Building '$package_name'..."
|
||||||
exec 99>&1
|
exec 99>&1
|
||||||
build_output="$("$TERMUX_PACKAGES_DIRECTORY"/build-package.sh "${BUILD_PACKAGE_OPTIONS[@]}" -a "$package_arch" "$package_name" 2>&1 | tee >(cat - >&99); exit ${PIPESTATUS[0]})";
|
build_output="$("$TERMUX_PACKAGES_DIRECTORY"/build-package.sh "${BUILD_PACKAGE_OPTIONS[@]}" --format "${TERMUX_PACKAGE_MANAGER//apt/debian}" -a "$package_arch" "$package_name" 2>&1 | tee >(cat - >&99); exit ${PIPESTATUS[0]})";
|
||||||
return_value=$?
|
return_value=$?
|
||||||
echo "[*] Building '$package_name' exited with exit code $return_value"
|
echo "[*] Building '$package_name' exited with exit code $return_value"
|
||||||
exec 99>&-
|
exec 99>&-
|
||||||
if [ $return_value -ne 0 ]; then
|
if [ $return_value -ne 0 ]; then
|
||||||
echo "Failed to build package '$package_name' for arch '$package_arch'" 1>&2
|
echo "Failed to build package '$package_name' for arch '$package_arch' in format '${TERMUX_PACKAGE_MANAGER//apt/debian}'" 1>&2
|
||||||
|
|
||||||
# Dependency packages may not have a build.sh, so we ignore the error.
|
# Dependency packages may not have a build.sh, so we ignore the error.
|
||||||
# A better way should be implemented to validate if its actually a dependency
|
# A better way should be implemented to validate if its actually a dependency
|
||||||
|
@ -100,7 +127,7 @@ extract_debs() {
|
||||||
local deb
|
local deb
|
||||||
local file
|
local file
|
||||||
|
|
||||||
cd "$TERMUX_BUILT_DEBS_DIRECTORY"
|
cd "$TERMUX_BUILT_PKGS_DIRECTORY"
|
||||||
|
|
||||||
if [ -z "$(ls -A)" ]; then
|
if [ -z "$(ls -A)" ]; then
|
||||||
echo $'\n\n\n'"No debs found"
|
echo $'\n\n\n'"No debs found"
|
||||||
|
@ -135,7 +162,7 @@ extract_debs() {
|
||||||
|
|
||||||
echo "[*] Extracting '$deb'..."
|
echo "[*] Extracting '$deb'..."
|
||||||
(cd "$package_tmpdir"
|
(cd "$package_tmpdir"
|
||||||
ar x "$TERMUX_BUILT_DEBS_DIRECTORY/$deb"
|
ar x "$TERMUX_BUILT_PKGS_DIRECTORY/$deb"
|
||||||
|
|
||||||
# data.tar may have extension different from .xz
|
# data.tar may have extension different from .xz
|
||||||
if [ -f "./data.tar.xz" ]; then
|
if [ -f "./data.tar.xz" ]; then
|
||||||
|
@ -188,6 +215,104 @@ extract_debs() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Extract *.pkg.* files to the bootstrap root.
|
||||||
|
extract_pkgs() {
|
||||||
|
|
||||||
|
local current_package_name
|
||||||
|
local current_package_name_sp
|
||||||
|
local package_tmpdir
|
||||||
|
local package_name_for_db
|
||||||
|
|
||||||
|
cd "$TERMUX_BUILT_PKGS_DIRECTORY"
|
||||||
|
|
||||||
|
if [ -z "$(ls -A)" ]; then
|
||||||
|
echo $'\n\n\n'"No pkgs found"
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
echo $'\n\n\n'"Pkg Files:"
|
||||||
|
echo "\""
|
||||||
|
ls
|
||||||
|
echo "\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
for pkg in *.pkg.*; do
|
||||||
|
current_package_name_sp=(${pkg//-/ })
|
||||||
|
current_package_name="$pkg"
|
||||||
|
for i in $(seq 0 2); do
|
||||||
|
current_package_name="${current_package_name//-${current_package_name_sp[$(($i-3))]/}}"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$current_package_name" == *"-static" ]]; then
|
||||||
|
echo "[*] Skipping static package '$pkg'..."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ " ${EXTRACTED_PACKAGES[*]} " == *" $current_package_name "* ]]; then
|
||||||
|
echo "[*] Skipping already extracted package '$current_package_name'..."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
EXTRACTED_PACKAGES+=("$current_package_name")
|
||||||
|
|
||||||
|
package_tmpdir="${BOOTSTRAP_PKGDIR}/${current_package_name}"
|
||||||
|
mkdir -p "$package_tmpdir"
|
||||||
|
rm -rf "$package_tmpdir"/*
|
||||||
|
|
||||||
|
echo "[*] Extracting '$pkg'..."
|
||||||
|
(cd "$package_tmpdir"
|
||||||
|
tar xJf "$TERMUX_BUILT_PKGS_DIRECTORY/$pkg"
|
||||||
|
if [ -d ./data ]; then
|
||||||
|
cp -r ./data "$BOOTSTRAP_ROOTFS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! ${BOOTSTRAP_ANDROID10_COMPATIBLE}; then
|
||||||
|
package_name_for_db="${current_package_name}-${current_package_name_sp[-3]}-${current_package_name_sp[-2]}"
|
||||||
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_name_for_db}"
|
||||||
|
cp -r .MTREE "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_name_for_db}/mtree"
|
||||||
|
{
|
||||||
|
format_entry "FILENAME" "${pkg//+/0}"
|
||||||
|
format_entry "NAME" "$current_package_name"
|
||||||
|
format_entry "BASE" $(get_info_pkg pkgbase)
|
||||||
|
format_entry "VERSION" $(get_info_pkg pkgver)
|
||||||
|
format_entry "DESC" "$(get_info_pkg pkgdesc)"
|
||||||
|
format_entry "GROUPS" $(get_info_pkg group)
|
||||||
|
format_entry "CSIZE" $(wc -c < "$TERMUX_BUILT_PKGS_DIRECTORY/$pkg")
|
||||||
|
format_entry "ISIZE" $(get_info_pkg size)
|
||||||
|
|
||||||
|
format_entry "MD5SUM" $(md5sum "$TERMUX_BUILT_PKGS_DIRECTORY/$pkg" | awk '{printf $1}')
|
||||||
|
format_entry "SHA256SUM" $(sha256sum "$TERMUX_BUILT_PKGS_DIRECTORY/$pkg" | awk '{printf $1}')
|
||||||
|
|
||||||
|
format_entry "URL" $(get_info_pkg url)
|
||||||
|
format_entry "LICENSE" $(get_info_pkg license)
|
||||||
|
format_entry "ARCH" $(get_info_pkg arch)
|
||||||
|
format_entry "BUILDDATE" $(get_info_pkg builddate)
|
||||||
|
format_entry "PACKAGER" $(get_info_pkg packager)
|
||||||
|
format_entry "REPLACES" $(get_info_pkg replaces)
|
||||||
|
format_entry "CONFLICTS" $(get_info_pkg conflict)
|
||||||
|
format_entry "PROVIDES" $(get_info_pkg provides)
|
||||||
|
|
||||||
|
format_entry "DEPENDS" $(get_info_pkg depend)
|
||||||
|
format_entry "OPTDEPENDS" $(get_info_pkg optdepend)
|
||||||
|
format_entry "MAKEDEPENDS" $(get_info_pkg makedepend)
|
||||||
|
format_entry "CHECKDEPENDS" $(get_info_pkg checkdepend)
|
||||||
|
} > "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_name_for_db}/desc"
|
||||||
|
|
||||||
|
if [ -f .INSTALL ]; then
|
||||||
|
cp -r .INSTALL "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_name_for_db}/install"
|
||||||
|
fi
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "%FILES%"
|
||||||
|
if [ -d ./data ]; then
|
||||||
|
find data
|
||||||
|
fi
|
||||||
|
} >> "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/${package_name_for_db}/files"
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
# Final stage: generate bootstrap archive and place it to current
|
# Final stage: generate bootstrap archive and place it to current
|
||||||
# working directory.
|
# working directory.
|
||||||
# Information about symlinks is stored in file SYMLINKS.txt.
|
# Information about symlinks is stored in file SYMLINKS.txt.
|
||||||
|
@ -260,6 +385,9 @@ Available command_options:
|
||||||
[ -a | --add <packages> ]
|
[ -a | --add <packages> ]
|
||||||
Additional packages to include into bootstrap archive.
|
Additional packages to include into bootstrap archive.
|
||||||
Multiple packages should be passed as comma-separated list.
|
Multiple packages should be passed as comma-separated list.
|
||||||
|
[ -pm <manager> ]
|
||||||
|
Set up a package manager in bootstrap. It can only be pacman
|
||||||
|
or apt (the default is apt).
|
||||||
[ --architectures <architectures> ]
|
[ --architectures <architectures> ]
|
||||||
Override default list of architectures for which bootstrap
|
Override default list of architectures for which bootstrap
|
||||||
archives will be created. Multiple architectures should be
|
archives will be created. Multiple architectures should be
|
||||||
|
@ -285,6 +413,7 @@ HELP_EOF
|
||||||
|
|
||||||
echo $'\n'"TERMUX_APP_PACKAGE: \"$TERMUX_APP_PACKAGE\""
|
echo $'\n'"TERMUX_APP_PACKAGE: \"$TERMUX_APP_PACKAGE\""
|
||||||
echo "TERMUX_PREFIX: \"${TERMUX_PREFIX[*]}\""
|
echo "TERMUX_PREFIX: \"${TERMUX_PREFIX[*]}\""
|
||||||
|
echo "TERMUX_PACKAGE_MANAGER: \"${TERMUX_PACKAGE_MANAGER}\""
|
||||||
echo "TERMUX_ARCHITECTURES: \"${TERMUX_ARCHITECTURES[*]}\""
|
echo "TERMUX_ARCHITECTURES: \"${TERMUX_ARCHITECTURES[*]}\""
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -315,6 +444,16 @@ main() {
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
--pm)
|
||||||
|
if [ $# -gt 1 ] && [ -n "$2" ] && [[ $2 != -* ]]; then
|
||||||
|
TERMUX_PACKAGE_MANAGER="$2"
|
||||||
|
shift 1
|
||||||
|
else
|
||||||
|
echo "[!] Option '--pm' requires an argument." 1>&2
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
--architectures)
|
--architectures)
|
||||||
if [ $# -gt 1 ] && [ -n "$2" ] && [[ $2 != -* ]]; then
|
if [ $# -gt 1 ] && [ -n "$2" ] && [[ $2 != -* ]]; then
|
||||||
TERMUX_ARCHITECTURES=()
|
TERMUX_ARCHITECTURES=()
|
||||||
|
@ -369,7 +508,7 @@ main() {
|
||||||
|
|
||||||
if [[ $FORCE_BUILD_PACKAGES == "1" ]]; then
|
if [[ $FORCE_BUILD_PACKAGES == "1" ]]; then
|
||||||
rm -f "$TERMUX_BUILT_PACKAGES_DIRECTORY_FOR_ARCH"/*
|
rm -f "$TERMUX_BUILT_PACKAGES_DIRECTORY_FOR_ARCH"/*
|
||||||
rm -f "$TERMUX_BUILT_DEBS_DIRECTORY"/*
|
rm -f "$TERMUX_BUILT_PKGS_DIRECTORY"/*
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
@ -379,14 +518,22 @@ main() {
|
||||||
|
|
||||||
# Create initial directories for $TERMUX_PREFIX
|
# Create initial directories for $TERMUX_PREFIX
|
||||||
if ! ${BOOTSTRAP_ANDROID10_COMPATIBLE}; then
|
if ! ${BOOTSTRAP_ANDROID10_COMPATIBLE}; then
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/etc/apt/apt.conf.d"
|
if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/etc/apt/preferences.d"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/etc/apt/apt.conf.d"
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/info"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/etc/apt/preferences.d"
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/triggers"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/info"
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/updates"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/triggers"
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/log/apt"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/updates"
|
||||||
touch "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/available"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/log/apt"
|
||||||
touch "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/status"
|
touch "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/available"
|
||||||
|
touch "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/dpkg/status"
|
||||||
|
else
|
||||||
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/sync"
|
||||||
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local"
|
||||||
|
echo "9" >> "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/lib/pacman/local/ALPM_DB_VERSION"
|
||||||
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/cache/pacman/pkg"
|
||||||
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/var/log"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/tmp"
|
mkdir -p "${BOOTSTRAP_ROOTFS}/${TERMUX_PREFIX}/tmp"
|
||||||
|
|
||||||
|
@ -397,7 +544,7 @@ main() {
|
||||||
|
|
||||||
# Package manager.
|
# Package manager.
|
||||||
if ! ${BOOTSTRAP_ANDROID10_COMPATIBLE}; then
|
if ! ${BOOTSTRAP_ANDROID10_COMPATIBLE}; then
|
||||||
PACKAGES+=("apt")
|
PACKAGES+=("${TERMUX_PACKAGE_MANAGER}")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Core utilities.
|
# Core utilities.
|
||||||
|
@ -422,14 +569,18 @@ main() {
|
||||||
PACKAGES+=("sed")
|
PACKAGES+=("sed")
|
||||||
PACKAGES+=("tar")
|
PACKAGES+=("tar")
|
||||||
PACKAGES+=("termux-exec")
|
PACKAGES+=("termux-exec")
|
||||||
PACKAGES+=("termux-keyring")
|
if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
||||||
|
PACKAGES+=("termux-keyring")
|
||||||
|
fi
|
||||||
PACKAGES+=("termux-tools")
|
PACKAGES+=("termux-tools")
|
||||||
PACKAGES+=("util-linux")
|
PACKAGES+=("util-linux")
|
||||||
PACKAGES+=("xz-utils")
|
PACKAGES+=("xz-utils")
|
||||||
|
|
||||||
# Additional.
|
# Additional.
|
||||||
PACKAGES+=("ed")
|
PACKAGES+=("ed")
|
||||||
PACKAGES+=("debianutils")
|
if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
||||||
|
PACKAGES+=("debianutils")
|
||||||
|
fi
|
||||||
PACKAGES+=("dos2unix")
|
PACKAGES+=("dos2unix")
|
||||||
PACKAGES+=("inetutils")
|
PACKAGES+=("inetutils")
|
||||||
PACKAGES+=("lsof")
|
PACKAGES+=("lsof")
|
||||||
|
@ -453,8 +604,13 @@ main() {
|
||||||
set -e
|
set -e
|
||||||
done
|
done
|
||||||
|
|
||||||
# Extract all debs.
|
if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then
|
||||||
extract_debs || return $?
|
# Extract all debs.
|
||||||
|
extract_debs || return $?
|
||||||
|
elif [ ${TERMUX_PACKAGE_MANAGER} = "pacman" ]; then
|
||||||
|
# Extract all pkgs.
|
||||||
|
extract_pkgs || return $?
|
||||||
|
fi
|
||||||
|
|
||||||
# Create bootstrap archive.
|
# Create bootstrap archive.
|
||||||
create_bootstrap_archive "$package_arch" || return $?
|
create_bootstrap_archive "$package_arch" || return $?
|
||||||
|
|
Loading…
Reference in New Issue