Skip to content

Commit 87a9ccb

Browse files
WIP for termux packages build infrastructure improvements
1 parent ad92965 commit 87a9ccb

25 files changed

+1963
-575
lines changed

build-package.sh

Lines changed: 89 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,19 @@ cd "$(realpath "$(dirname "$0")")"
2424
TERMUX_SCRIPTDIR=$(pwd)
2525
export TERMUX_SCRIPTDIR
2626

27+
28+
29+
# Source the utils library.
30+
# shellcheck source=scripts/utils/utils.sh
31+
source "$TERMUX_SCRIPTDIR/scripts/utils/utils.sh"
32+
33+
# Set all utils library default variables
34+
utils__set_all_default_variables || exit $?
35+
2736
# Store pid of current process in a file for docker__run_docker_exec_trap
28-
source "$TERMUX_SCRIPTDIR/scripts/utils/docker/docker.sh"; docker__create_docker_exec_pid_file
37+
docker__create_docker_exec_pid_file
38+
2939

30-
# Source the `termux_package` library.
31-
source "$TERMUX_SCRIPTDIR/scripts/utils/termux/package/termux_package.sh"
3240

3341
export SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH:-$(git -c log.showSignature=false log -1 --pretty=%ct 2>/dev/null || date "+%s")}
3442

@@ -60,6 +68,8 @@ fi
6068

6169
export TERMUX_REPO_PKG_FORMAT=$(jq --raw-output '.pkg_format // "debian"' ${TERMUX_SCRIPTDIR}/repo.json)
6270

71+
TERMUX_PKGS__BUILD__NO_BUILD_UNNEEDED_SUBPACKAGES="false"
72+
6373
# Special variable for internal use. It forces script to ignore
6474
# lock file.
6575
: "${TERMUX_BUILD_IGNORE_LOCK:=false}"
@@ -221,6 +231,15 @@ source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_start_build.sh"
221231
# shellcheck source=scripts/build/termux_step_start_build.sh
222232
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_cleanup_packages.sh"
223233

234+
# Set the package version variables. Not to be overridden by packages.
235+
# shellcheck source=scripts/build/termux_set_package_version_variables.sh
236+
source "$TERMUX_SCRIPTDIR/scripts/build/termux_set_package_version_variables.sh"
237+
238+
# Validate if all package files for package were successfully built.
239+
# Not to be overridden by packages.
240+
# shellcheck source=scripts/build/termux_validate_built_packages.sh
241+
source "$TERMUX_SCRIPTDIR/scripts/build/termux_validate_built_packages.sh"
242+
224243
# Download or build dependencies. Not to be overridden by packages.
225244
# shellcheck source=scripts/build/termux_step_create_timestamp_file.sh
226245
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_create_timestamp_file.sh"
@@ -343,6 +362,10 @@ source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_copy_into_massagedir.sh"
343362
# shellcheck source=scripts/build/termux_step_create_subpkg_debscripts.sh
344363
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_create_subpkg_debscripts.sh"
345364

365+
# Set all subpackages for package in TERMUX_PKG_SUBPACKAGES_LIST.
366+
# shellcheck source=scripts/build/termux_set_subpackages.sh
367+
source "$TERMUX_SCRIPTDIR/scripts/build/termux_set_subpackages.sh"
368+
346369
# Create all subpackages. Run from termux_step_massage
347370
# shellcheck source=scripts/build/termux_create_debian_subpackages.sh
348371
source "$TERMUX_SCRIPTDIR/scripts/build/termux_create_debian_subpackages.sh"
@@ -382,6 +405,10 @@ source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_create_debscripts.sh"
382405
# shellcheck source=scripts/build/termux_step_create_pacman_install_hook.sh
383406
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_create_pacman_install_hook.sh"
384407

408+
# Set the package file variables. Not to be overridden by packages.
409+
# shellcheck source=scripts/build/termux_set_package_file_variables.sh
410+
source "$TERMUX_SCRIPTDIR/scripts/build/termux_set_package_file_variables.sh"
411+
385412
# Create the build deb file. Not to be overridden by package scripts.
386413
# shellcheck source=scripts/build/termux_step_create_debian_package.sh
387414
source "$TERMUX_SCRIPTDIR/scripts/build/termux_step_create_debian_package.sh"
@@ -500,10 +527,11 @@ _show_usage() {
500527
echo " -o Specify directory where to put built packages. Default: output/."
501528
echo " --format Specify package output format (debian, pacman)."
502529
echo " --library Specify library of package (bionic, glibc)."
530+
echo " --no-build-unneeded-subpackages Do not build unneeded subpackages that are not dependencies of parent package."
503531
exit 1
504532
}
505533

506-
declare -a PACKAGE_LIST=()
534+
declare -a PACKAGES_ARGS_LIST=()
507535

508536
if [ "$#" -lt 1 ]; then _show_usage; fi
509537
while (($# >= 1)); do
@@ -532,6 +560,9 @@ while (($# >= 1)); do
532560
termux_error_exit "./build-package.sh: option '--library' requires an argument"
533561
fi
534562
;;
563+
--no-build-unneeded-subpackages)
564+
export TERMUX_PKGS__BUILD__NO_BUILD_UNNEEDED_SUBPACKAGES="true"
565+
;;
535566
-a)
536567
if [ $# -ge 2 ]; then
537568
shift 1
@@ -582,11 +613,10 @@ while (($# >= 1)); do
582613
-c) TERMUX_CONTINUE_BUILD=true;;
583614
-C) TERMUX_CLEANUP_BUILT_PACKAGES_ON_LOW_DISK_SPACE=true;;
584615
-*) termux_error_exit "./build-package.sh: illegal option '$1'";;
585-
*) PACKAGE_LIST+=("$1");;
616+
*) PACKAGES_ARGS_LIST+=("$1");;
586617
esac
587618
shift 1
588619
done
589-
unset -f _show_usage
590620

591621
# Dependencies should be used from repo only if they are built for
592622
# same package name.
@@ -613,6 +643,11 @@ if [ -n "${TERMUX_PACKAGE_LIBRARY-}" ]; then
613643
esac
614644
fi
615645

646+
if [ "${TERMUX_INSTALL_DEPS:-false}" = "true" ]; then
647+
# Request `buildorder.py` to return legacy build order if a cycle is found with topological build order.
648+
export TERMUX_PKGS__BUILD_ORDER__RETURN_LEGACY_TARGET_BUILD_ORDER_ON_CYCLE="true"
649+
fi
650+
616651
if [ "${TERMUX_INSTALL_DEPS-false}" = "true" ] || [ "${TERMUX_PACKAGE_LIBRARY-bionic}" = "glibc" ]; then
617652
# Setup PGP keys for verifying integrity of dependencies.
618653
# Keys are obtained from our keyring package.
@@ -630,7 +665,32 @@ if [ "${TERMUX_INSTALL_DEPS-false}" = "true" ] || [ "${TERMUX_PACKAGE_LIBRARY-bi
630665
}
631666
fi
632667

633-
for ((i=0; i<${#PACKAGE_LIST[@]}; i++)); do
668+
# Remove duplicate and empty packages passed
669+
declare -A PACKAGES_FOUND_LIST=()
670+
declare -a PACKAGES_LIST=()
671+
672+
for i in "${PACKAGES_ARGS_LIST[@]}"; do
673+
if [[ -z "${i:-}" ]]; then
674+
continue
675+
fi
676+
if [[ -z "${PACKAGES_FOUND_LIST["$i"]:-}" ]]; then
677+
PACKAGES_LIST+=("$i")
678+
fi
679+
PACKAGES_FOUND_LIST["$i"]=1
680+
done
681+
unset PACKAGES_ARGS_LIST
682+
unset PACKAGES_FOUND_LIST
683+
684+
if [ "${#PACKAGES_LIST[@]}" -lt 1 ]; then _show_usage; unset -f _show_usage; fi
685+
686+
687+
688+
# Build all packages in PACKAGES_LIST
689+
if [ "$TERMUX_BUILD_PACKAGE_CALL_DEPTH" -ge 1 ]; then echo $'\n\n\n\n\n'; fi
690+
echo -n "[*] Building packages for arch '${TERMUX_ARCH:="aarch64"}': "
691+
for ((i=0; i<${#PACKAGES_LIST[@]}; i++)); do [ "$i" -ge 1 ] && echo -n ", "; echo -n "'${PACKAGES_LIST[i]}'"; done; echo
692+
693+
for ((i=0; i<${#PACKAGES_LIST[@]}; i++)); do
634694
# Following commands must be executed under lock to prevent running
635695
# multiple instances of "./build-package.sh".
636696
#
@@ -658,35 +718,32 @@ for ((i=0; i<${#PACKAGE_LIST[@]}; i++)); do
658718
$(test "${TERMUX_WITHOUT_DEPVERSION_BINDING:-}" = "true" && echo "-w") \
659719
$(test -n "${TERMUX_PACKAGE_FORMAT:-}" && echo "--format $TERMUX_PACKAGE_FORMAT") \
660720
$(test -n "${TERMUX_PACKAGE_LIBRARY:-}" && echo "--library $TERMUX_PACKAGE_LIBRARY") \
661-
"${PACKAGE_LIST[i]}"
721+
$(test "${TERMUX_PKGS__BUILD__NO_BUILD_UNNEEDED_SUBPACKAGES:-}" = "true" && echo "--no-build-unneeded-subpackages") \
722+
"${PACKAGES_LIST[i]}"
662723
done
663724
exit
664725
fi
665726

666-
# Check the package to build:
667-
TERMUX_PKG_NAME=$(basename "${PACKAGE_LIST[i]}")
668-
export TERMUX_PKG_BUILDER_DIR=
669-
if [[ ${PACKAGE_LIST[i]} == *"/"* ]]; then
670-
# Path to directory which may be outside this repo:
671-
if [ ! -d "${PACKAGE_LIST[i]}" ]; then termux_error_exit "'${PACKAGE_LIST[i]}' seems to be a path but is not a directory"; fi
672-
export TERMUX_PKG_BUILDER_DIR=$(realpath "${PACKAGE_LIST[i]}")
727+
# Get package directory and type for the package to build:
728+
declare orig_package_name package_name package_dir subpackage_name is_subpackage is_virtual
729+
termux_package__set_package_build_file_variables "${PACKAGES_LIST[i]}" "$TERMUX_SCRIPTDIR" "$TERMUX_PACKAGES_DIRECTORIES" "${TERMUX_IS_DISABLED:-}"
730+
731+
if [ "$i" -ge 1 ]; then echo $'\n\n\n'; fi
732+
if [ "$is_subpackage" != "true" ]; then
733+
echo "[*] Building package '$package_name'..."
673734
else
674-
# Package name:
675-
for package_directory in $TERMUX_PACKAGES_DIRECTORIES; do
676-
if [ -d "${TERMUX_SCRIPTDIR}/${package_directory}/${TERMUX_PKG_NAME}" ]; then
677-
export TERMUX_PKG_BUILDER_DIR=${TERMUX_SCRIPTDIR}/$package_directory/$TERMUX_PKG_NAME
678-
break
679-
elif [ -n "${TERMUX_IS_DISABLED=""}" ] && [ -d "${TERMUX_SCRIPTDIR}/disabled-packages/${TERMUX_PKG_NAME}" ]; then
680-
export TERMUX_PKG_BUILDER_DIR=$TERMUX_SCRIPTDIR/disabled-packages/$TERMUX_PKG_NAME
681-
break
682-
fi
683-
done
684-
if [ -z "${TERMUX_PKG_BUILDER_DIR}" ]; then
685-
termux_error_exit "No package $TERMUX_PKG_NAME found in any of the enabled repositories. Are you trying to set up a custom repository?"
735+
if [ "$is_virtual" = "true" ]; then
736+
echo "[*] Building package '$package_name' for virtual subpackage '$subpackage_name'..."
737+
else
738+
echo "[*] Building package '$package_name' for subpackage '$subpackage_name'..."
686739
fi
687740
fi
741+
742+
TERMUX_PKG_NAME="$package_name"
743+
export TERMUX_ORIG_PKG_NAME="$orig_package_name"
744+
export TERMUX_PKG_BUILDER_DIR="$package_dir"
688745
TERMUX_PKG_BUILDER_SCRIPT=$TERMUX_PKG_BUILDER_DIR/build.sh
689-
if test ! -f "$TERMUX_PKG_BUILDER_SCRIPT"; then
746+
if [ ! -f "$TERMUX_PKG_BUILDER_SCRIPT" ]; then
690747
termux_error_exit "No build.sh script at package dir $TERMUX_PKG_BUILDER_DIR!"
691748
fi
692749

@@ -763,11 +820,15 @@ for ((i=0; i<${#PACKAGE_LIST[@]}; i++)); do
763820
else
764821
termux_error_exit "Unknown packaging format '$TERMUX_PACKAGE_FORMAT'."
765822
fi
823+
824+
termux_validate_built_packages
825+
766826
# Saving a list of compiled packages for further work with it
767827
if termux_check_package_in_building_packages_list "${TERMUX_PKG_BUILDER_DIR#${TERMUX_SCRIPTDIR}/}"; then
768828
sed -i "\|^${TERMUX_PKG_BUILDER_DIR#${TERMUX_SCRIPTDIR}/}$|d" "$TERMUX_BUILD_PACKAGE_CALL_BUILDING_PACKAGES_LIST_FILE_PATH"
769829
fi
770830
termux_add_package_to_built_packages_list "$TERMUX_PKG_NAME"
831+
771832
termux_step_finish_build
772833
) 5< "$TERMUX_BUILD_LOCK_FILE"
773834
done

packages/libcurl/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ TERMUX_PKG_SHA256=4a093979a3c2d02de2fbc00549a32771007f2e78032c6faa5ecd2f7a9e1520
88
TERMUX_PKG_AUTO_UPDATE=true
99
TERMUX_PKG_UPDATE_VERSION_REGEXP="\d+.\d+.\d+"
1010
TERMUX_PKG_DEPENDS="libnghttp2, libnghttp3, libssh2, openssl (>= 1:3.2.1-1), zlib"
11+
# configure: error: libssh2 libs and/or directories were not found where specified!
12+
TERMUX_PKG_BUILD_DEPENDS="libssh2"
1113
TERMUX_PKG_BREAKS="libcurl-dev"
1214
TERMUX_PKG_REPLACES="libcurl-dev"
1315
TERMUX_PKG_ESSENTIAL=true

packages/swig/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ TERMUX_PKG_SRCURL=https://downloads.sourceforge.net/swig/swig-$TERMUX_PKG_VERSIO
88
TERMUX_PKG_SHA256=44fc829f70f1e17d635a2b4d69acab38896699ecc24aa023e516e0eabbec61b8
99
TERMUX_PKG_AUTO_UPDATE=true
1010
TERMUX_PKG_DEPENDS="libc++, pcre2, zlib"
11+
# fatal error: 'pcre2.h' file not found
12+
TERMUX_PKG_BUILD_DEPENDS="pcre2"
1113
TERMUX_PKG_BUILD_IN_SRC=true

packages/tk/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ TERMUX_PKG_SRCURL=https://downloads.sourceforge.net/sourceforge/tcl/tk${TERMUX_P
88
TERMUX_PKG_SHA256=8ffdb720f47a6ca6107eac2dd877e30b0ef7fac14f3a84ebbd0b3612cee41a94
99
TERMUX_PKG_AUTO_UPDATE=false
1010
TERMUX_PKG_DEPENDS="fontconfig, libx11, libxft, libxss, tcl"
11+
# fatal error: 'X11/Xlib.h' file not found
12+
TERMUX_PKG_BUILD_DEPENDS="libx11"
1113
TERMUX_PKG_NO_STATICSPLIT=true
1214
TERMUX_PKG_MAKE_INSTALL_TARGET="install install-private-headers"
1315

0 commit comments

Comments
 (0)