#!/usr/bin/env bash
# build.sh - Build Jellyfin binary packages
# Part of the Jellyfin Project
set -o errexit
set -o pipefail
usage( ) {
echo -e "build.sh - Build Jellyfin binary packages"
echo -e "Usage:"
echo -e " $0 -t/--type <BUILD_TYPE> -p/--platform <PLATFORM> [-k/--keep-artifacts] [-l/--list-platforms] "
echo -e "Notes:"
echo -e " * BUILD_TYPE can be one of: [native, docker] and must be specified"
echo -e " * native: Build using the build script in the host OS"
echo -e " * docker: Build using the build script in a standardized Docker container"
echo -e " * PLATFORM can be any platform shown by -l/--list-platforms and must be specified"
echo -e " * If -k/--keep-artifacts is specified, transient artifacts (e.g. Docker containers) will be"
echo -e " retained after the build is finished; the source directory will still be cleaned"
echo -e " * If -l/--list-platforms is specified, all other arguments are ignored; the script will print"
echo -e " the list of supported platforms and exit"
}
list_platforms( ) {
declare -a platforms
platforms = (
$( find deployment -maxdepth 1 -mindepth 1 -name "build.*" | awk -F'.' '{ $1=""; printf $2; if ($3 != ""){ printf "." $3; }; if ($4 != ""){ printf "." $4; }; print ""; }' | sort )
)
echo -e "Valid platforms:"
echo
for platform in ${ platforms [@] } ; do
echo -e " * ${ platform } : $( grep '^#=' deployment/build.${ platform } | sed 's/^#= //' ) "
done
}
do_build_native( ) {
if [ [ ! -f $( which dpkg ) || $( dpkg --print-architecture | head -1 ) != " ${ PLATFORM ##*. } " ] ] ; then
echo "Cross-building is not supported for native builds, use 'docker' builds on amd64 for cross-building."
exit 1
fi
export IS_DOCKER = NO
deployment/build.${ PLATFORM }
}
do_build_docker( ) {
if [ [ -f $( which dpkg ) && $( dpkg --print-architecture | head -1 ) != "amd64" ] ] ; then
echo "Docker-based builds only support amd64-based cross-building; use a 'native' build instead."
exit 1
fi
if [ [ ! -f deployment/Dockerfile.${ PLATFORM } ] ] ; then
echo " Missing Dockerfile for platform ${ PLATFORM } "
exit 1
fi
if [ [ ${ KEEP_ARTIFACTS } = = YES ] ] ; then
docker_args = ""
else
docker_args = "--rm"
fi
docker build . -t " jellyfin-builder. ${ PLATFORM } " -f deployment/Dockerfile.${ PLATFORM }
mkdir -p ${ ARTIFACT_DIR }
docker run $docker_args -v " ${ SOURCE_DIR } :/jellyfin " -v " ${ ARTIFACT_DIR } :/dist " " jellyfin-builder. ${ PLATFORM } "
}
while [ [ $# -gt 0 ] ] ; do
key = " $1 "
case $key in
-t| --type)
BUILD_TYPE = " $2 "
shift # past argument
shift # past value
; ;
-p| --platform)
PLATFORM = " $2 "
shift # past argument
shift # past value
; ;
-k| --keep-artifacts)
KEEP_ARTIFACTS = YES
shift # past argument
; ;
-l| --list-platforms)
list_platforms
exit 0
; ;
-h| --help)
usage
exit 0
; ;
*) # unknown option
echo " Unknown option $1 "
usage
exit 1
; ;
esac
done
if [ [ -z ${ BUILD_TYPE } || -z ${ PLATFORM } ] ] ; then
usage
exit 1
fi
export SOURCE_DIR = " $( pwd ) "
export ARTIFACT_DIR = " ${ SOURCE_DIR } /../bin/ ${ PLATFORM } "
# Determine build type
case ${ BUILD_TYPE } in
native)
do_build_native
; ;
docker)
do_build_docker
; ;
esac