123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #!/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
|