sortix-mirror/build-aux/build-ports.sh
Jonas 'Sortie' Termansen d189183900 Third generation Tix.
The .tix.tar.xz binary package format now stores the contents in the root
rather than the data/ subdirectory and the tix metadata now has the same
layout as the loose files in /tix, such that a .tix.tar.xz package can
simply be directly extracted into the filesystem. The /tix/manifest/ is now
included in the binary package rather than being generated on installation.

The /tix/collection.conf and /tix/tixinfo metadata files are now in the
tix-vars(1) format in the style of port(5).

The /tix/installed.list file has been removed since it isn't loose file
compatible and one can list the /tix/tixinfo directory instead.

The /tix/repository.list file has been removed since the feature is unused
and doesn't match the future direction of tix.

The kernel support for tix binary packages has been removed since it will
simply install by extracting the tar archive into the root filesystem.

Add the post-install sha256sum to the port version stamp.
2023-07-15 16:43:27 +02:00

150 lines
4.5 KiB
Bash
Executable file

#!/bin/sh
set -e
make_dir_path_absolute() {
(cd "$1" && pwd)
}
has_command() {
which "$1" > /dev/null
}
# Determine what's supposed to happen.
if [ $# = 0 ]; then
echo "$0: usage: $0 <operation>" >&2
exit 1
fi
OPERATION="$1"
case "$OPERATION" in
download|extract|build) ;;
*) echo "$0: error: Invalid operation: $OPERATION" >&2
exit 1
esac
# Detect if the environment isn't set up properly.
if [ -z "$HOST" ]; then
echo "$0: error: You need to set \$HOST" >&2
exit 1
elif [ -z "$SYSROOT" ]; then
echo "$0: error: You need to set \$SYSROOT" >&2
exit 1
elif [ -z "$SORTIX_PORTS_DIR" ]; then
echo "$0: error: You need to set \$SORTIX_PORTS_DIR" >&2
exit 1
elif [ -z "$SORTIX_MIRROR_DIR" ]; then
echo "$0: error: You need to set \$SORTIX_MIRROR_DIR" >&2
exit 1
elif [ -z "$SORTIX_REPOSITORY_DIR" ]; then
echo "$0: error: You need to set \$SORTIX_REPOSITORY_DIR" >&2
exit 1
elif ! [ -d "$SORTIX_PORTS_DIR" ]; then
echo "Warning: No ports directory found, third party software will not be built"
exit 0
elif ! has_command tix-rmdiff; then
echo "$0: error: You need to have installed Tix locally to compile ports." >&2
exit 1
fi
# Create the mirror directory for downloaded archives.
mkdir -p "$SORTIX_MIRROR_DIR"
# Add the platform triplet to the binary repository path.
if [ "$OPERATION" = build ]; then
SORTIX_REPOSITORY_DIR="$SORTIX_REPOSITORY_DIR/$HOST"
mkdir -p "$SORTIX_REPOSITORY_DIR"
fi
# Create the system root if absent.
if [ "$OPERATION" = build ]; then
mkdir -p "$SYSROOT"
fi
# Make paths absolute for later use.
SORTIX_MIRROR_DIR=$(make_dir_path_absolute "$SORTIX_MIRROR_DIR")
SORTIX_PORTS_DIR=$(make_dir_path_absolute "$SORTIX_PORTS_DIR")
if [ "$OPERATION" = build ]; then
SYSROOT=$(make_dir_path_absolute "$SYSROOT")
SORTIX_REPOSITORY_DIR=$(make_dir_path_absolute "$SORTIX_REPOSITORY_DIR")
fi
# Decide the optimization options with which the ports will be built.
if [ -z "${OPTLEVEL+x}" ]; then OPTLEVEL="-Os -s"; fi
if [ -z "${PORTS_OPTLEVEL+x}" ]; then PORTS_OPTLEVEL="$OPTLEVEL"; fi
if [ -z "${PORTS_CFLAGS+x}" ]; then PORTS_CFLAGS="$PORTS_OPTLEVEL"; fi
if [ -z "${PORTS_CXXFLAGS+x}" ]; then PORTS_CXXFLAGS="$PORTS_OPTLEVEL"; fi
if [ -z "${CFLAGS+x}" ]; then CFLAGS="$PORTS_CFLAGS"; fi
if [ -z "${CXXFLAGS+x}" ]; then CXXFLAGS="$PORTS_CXXFLAGS"; fi
CFLAGS="$CFLAGS -Werror=format -Wno-error=format-contains-nul -Werror=implicit-function-declaration"
CXXFLAGS="$CXXFLAGS -Werror=format -Wno-error=format-contains-nul"
export CFLAGS
export CXXFLAGS
# Initialize Tix package management in the system root if absent.
if [ "$OPERATION" = build ]; then
if [ ! -e "$SYSROOT/tix/collection.conf" ]; then
tix-collection "$SYSROOT" create --platform=$HOST --prefix= --generation=3
fi
fi
PACKAGES="$("$(dirname -- "$0")"/list-packages.sh PACKAGES)"
# Simply stop if there is no packages available.
if [ -z "$PACKAGES" ]; then
exit 0
fi
# Decide the order the packages are built in according to their dependencies.
if [ "$OPERATION" = build ]; then
PACKAGES="$(echo "$PACKAGES" | tr ' ' '\n' | sort -R)"
DEPENDENCY_MAKEFILE=$(mktemp)
(for PACKAGE in $PACKAGES; do
DEPENDENCIES="$(PACKAGES="$PACKAGES" \
"$(dirname -- "$0")"/list-packages.sh \
--dependencies $PACKAGE)"
echo "$PACKAGE: $(echo "$DEPENDENCIES" | tr '\n' ' ' | sed -E 's/ +$/\n/')"
echo " @echo $PACKAGE"
done;
printf ".PHONY:"
for PACKAGE in $PACKAGES; do
printf " $PACKAGE"
done;
echo) > "$DEPENDENCY_MAKEFILE"
BUILD_LIST=$(unset MAKE;
unset MFLAGS;
unset MAKEFLAGS;
make -Bs -f "$DEPENDENCY_MAKEFILE" $PACKAGES)
rm -f "$DEPENDENCY_MAKEFILE"
PACKAGES="$BUILD_LIST"
fi
unset CACHE_PACKAGE
unset END
if [ "$OPERATION" = download ]; then
END=download
elif [ "$OPERATION" = extract ]; then
END=extract
else
CACHE_PACKAGE=--cache-package
fi
# Build and install all the packages.
for PACKAGE in $PACKAGES; do
SOURCE_PORT=$(tix-vars -d '' $SORTIX_PORTS_DIR/$PACKAGE/$PACKAGE.port \
SOURCE_PORT)
tix-port \
${BUILD:+--build="$BUILD"} \
$CACHE_PACKAGE \
--collection="$SYSROOT" \
--destination="$SORTIX_REPOSITORY_DIR" \
${END:+--end="$END"} \
--generation=3 \
--host=$HOST \
${SORTIX_PORTS_MIRROR:+--mirror="$SORTIX_PORTS_MIRROR"} \
--mirror-directory="$SORTIX_MIRROR_DIR" \
--prefix= \
${SOURCE_PORT:+--source-port="$SORTIX_PORTS_DIR/$SOURCE_PORT/$SOURCE_PORT"} \
--sysroot="$SYSROOT" \
"$SORTIX_PORTS_DIR/$PACKAGE/$PACKAGE"
done