aboutsummaryrefslogtreecommitdiff
path: root/build.sh
blob: 8256f9ea31a8134a162a7c408eb72fd021faea18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/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; } 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 [[ $( 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 ! dpkg --print-architecture | grep -q '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