mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-31 10:37:22 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |