aboutsummaryrefslogtreecommitdiffhomepage
path: root/source/build.sh
blob: 53671a1652474a91fa0c523631c058fed98c7e5f (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/usr/bin/env bash
set -e
TRANSLATION_DIR="../Translations"
#TRANSLATION_SCRIPT="make_translation.py"

# AVAILABLE_LANGUAGES will be calculating according to json files in $TRANSLATION_DIR
AVAILABLE_LANGUAGES=()
BUILD_LANGUAGES=()
AVAILABLE_MODELS=("TS100" "TS80" "TS80P" "Pinecil" "MHP30" "Pinecilv2" "S60" "S60P" "TS101")
BUILD_MODELS=()

builder_info() {
    echo -e "
********************************************
               IronOS Firmware
        builder for Miniware + Pine64

                                    by Ralim
********************************************"
}

# Calculate available languages
for f in "$TRANSLATION_DIR"/translation_*.json; do
    AVAILABLE_LANGUAGES+=("$(echo "$f" | tr "[:lower:]" "[:upper:]" | sed "s/[^_]*_//" | sed "s/\.JSON//g")")
done

usage() {
    builder_info
    echo -e "
Usage : 
    $(basename "$0") [-l <LANG_CODES>] [-m <MODELS>] [-h]

Parameters :
    -l LANG_CODE : Force a specific language (${AVAILABLE_LANGUAGES[*]})
    -m MODEL     : Force a specific model (${AVAILABLE_MODELS[*]})
    -h           : Show this help message

Example : 
    $(basename "$0") -l EN -m TS100                     (Build one language and model)
    $(basename "$0") -l EN -m \"TS100 MHP30\"             (Build one language and multi models)
    $(basename "$0") -l \"DE EN\" -m \"TS100 MHP30\"        (Build multi languages and models)

INFO : 
    By default, without parameters, the build is for all platforms and all languages

" 1>&2
    exit 1
}

StartBuild() {
    read -n 1 -r -s -p $'Press Enter to start the building process...\n'
}

checkLastCommand() {
    if [ $? -eq 0 ]; then
        echo "    [Success]"
        echo "********************************************"
    else
        forceExit "checkLastCommand"
    fi
}

forceExit() {
    if [ -n "$*" ]; then
        echo -e "\n\n    [Error]: $*"
    else
        echo "    [Error]"
    fi
    echo "********************************************"
    echo " -- Stop on error --"
    exit 1
}

isInArray() {
    local value="$1"   # Save first argument in a variable
    shift              # Shift all arguments to the left (original $1 gets lost)
    local array=("$@") # Rebuild the array with rest of arguments

    for item in "${array[@]}"; do
        [[ $value == "$item" ]] && return 0
    done
    return 1
}

declare -a margs=()
declare -a largs=()

while getopts "h:l:m:" option; do
    case "${option}" in
    h)
        usage
        ;;
    l)
        IFS=' ' read -r -a largs <<<"${OPTARG}"
        ;;
    m)
        IFS=' ' read -r -a margs <<<"${OPTARG}"
        ;;
    *)
        usage
        ;;
    esac
done
shift $((OPTIND - 1))
builder_info

# Checking requested language
echo -n "Available languages :"
echo " ${AVAILABLE_LANGUAGES[*]}"
echo -n "Requested languages : "
if ((${#largs[@]})); then
    for i in "${largs[@]}"; do
        i=$(echo "${i}" | tr '[:lower:]' '[:upper:]')
        if isInArray "$i" "${AVAILABLE_LANGUAGES[@]}"; then
            echo -n "$i "
            BUILD_LANGUAGES+=("$i")
        else
            forceExit "Language '$i' is unknown. Check and use only from the available languages."
        fi
    done
    echo ""
fi
if [ -z "${BUILD_LANGUAGES[*]}" ]; then
    echo "    No custom languages selected."
    echo "    Building: [ALL LANGUAGES]"
    BUILD_LANGUAGES+=("${AVAILABLE_LANGUAGES[@]}")
fi
echo "********************************************"

# Checking requested model
echo -n "Available models :"
echo " ${AVAILABLE_MODELS[*]}"
echo -n "Requested models : "
if ((${#margs[@]})); then
    for i in "${margs[@]}"; do

        if [[ "$i" != "Pinecil" ]] && [[ "$i" != "Pinecilv2" ]]; then # Dirty. Need to adapt the Build process to use upper cases only
            i=$(echo "${i}" | tr '[:lower:]' '[:upper:]')
        fi

        if isInArray "$i" "${AVAILABLE_MODELS[@]}"; then
            echo -n "$i "
            BUILD_MODELS+=("$i")
        else
            forceExit "Model '$i' is unknown. Check and use only from the available models."
        fi
    done
    echo ""
fi

if [ -z "${BUILD_MODELS[*]}" ]; then
    echo "    No custom models selected."
    echo "    Building: [ALL MODELS]"
    BUILD_MODELS+=("${AVAILABLE_MODELS[@]}")
fi

echo "********************************************"

##
#StartBuild

if [ ${#BUILD_LANGUAGES[@]} -gt 0 ] && [ ${#BUILD_MODELS[@]} -gt 0 ]; then
    echo "Cleaning previous builds"
    rm -rf Hexfile/ >/dev/null
    rm -rf Objects/ >/dev/null
    make clean >/dev/null
    checkLastCommand

    for model in "${BUILD_MODELS[@]}"; do
        echo "Building firmware for $model in ${BUILD_LANGUAGES[*]}"
        make -j"$(nproc)" model="$model" "${BUILD_LANGUAGES[@]/#/firmware-}" >/dev/null
        checkLastCommand
    done
else
    forceExit "Nothing to build. (no model or language specified)"
fi
echo " -- Firmwares successfully generated --"
echo "End..."