build-bootstraps.sh: adding a way to generate bootstrap based on pacman

This commit is contained in:
Maxython 2022-05-07 23:13:37 +00:00
parent d46e3bc8a4
commit e117fd3ec8
1 changed files with 175 additions and 19 deletions

View File

@ -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 $?