Merge branch 'devel/master' into tizen
[platform/core/uifw/dali-adaptor.git] / workload-install.sh
1 #
2 # Copyright (c) Samsung Electronics. All rights reserved.
3 # Licensed under the MIT license. See LICENSE file in the project root for full license information.
4 #
5
6 #!/bin/bash -e
7
8 MANIFEST_BASE_NAME="samsung.net.sdk.tizen.manifest"
9 MANIFEST_VERSION="<latest>"
10 DOTNET_INSTALL_DIR="<auto>"
11 DOTNET_TARGET_VERSION_BAND="<auto>"
12 DOTNET_DEFAULT_PATH_LINUX="/usr/share/dotnet"
13 DOTNET_DEFAULT_PATH_MACOS="/usr/local/share/dotnet"
14 UPDATE_ALL_WORKLOADS="false"
15
16 LatestVersionMap=(
17     "$MANIFEST_BASE_NAME-6.0.100=7.0.101"
18     "$MANIFEST_BASE_NAME-6.0.200=7.0.100-preview.13.6"
19     "$MANIFEST_BASE_NAME-6.0.300=7.0.304"
20     "$MANIFEST_BASE_NAME-6.0.400=7.0.400"
21     "$MANIFEST_BASE_NAME-7.0.100-preview.6=7.0.100-preview.6.14"
22     "$MANIFEST_BASE_NAME-7.0.100-preview.7=7.0.100-preview.7.20"
23     "$MANIFEST_BASE_NAME-7.0.100-rc.1=7.0.100-rc.1.22"
24     "$MANIFEST_BASE_NAME-7.0.100-rc.2=7.0.100-rc.2.24"
25     "$MANIFEST_BASE_NAME-7.0.100=7.0.103"
26     "$MANIFEST_BASE_NAME-8.0.100-alpha.1=7.0.104"
27     )
28
29 while [ $# -ne 0 ]; do
30     name=$1
31     case "$name" in
32         -v|--version)
33             shift
34             MANIFEST_VERSION=$1
35             ;;
36         -d|--dotnet-install-dir)
37             shift
38             DOTNET_INSTALL_DIR=$1
39             ;;
40         -t|--dotnet-target-version-band)
41             shift
42             DOTNET_TARGET_VERSION_BAND=$1
43             ;;
44         -u|--update-all-workloads)
45             shift
46             UPDATE_ALL_WORKLOADS="true"
47             ;;
48         -h|--help)
49             script_name="$(basename "$0")"
50             echo "Tizen Workload Installer"
51             echo "Usage: $script_name [-v|--version <VERSION>] [-d|--dotnet-install-dir <DIR>] [-t|--dotnet-target-version-band <VERSION>]"
52             echo "       $script_name -h|-?|--help"
53             echo ""
54             echo "Options:"
55             echo "  -v,--version <VERSION>                     Use specific VERSION, Defaults to \`$MANIFEST_VERSION\`."
56             echo "  -d,--dotnet-install-dir <DIR>              Dotnet SDK Location installed, Defaults to \`$DOTNET_INSTALL_DIR\`."
57             echo "  -t,--dotnet-target-version-band <VERSION>  Use specific dotnet version band for install location, Defaults to \`$DOTNET_TARGET_VERSION_BAND\`."
58             exit 0
59             ;;
60         *)
61             echo "Unknown argument \`$name\`"
62             exit 1
63             ;;
64     esac
65
66     shift
67 done
68
69 function read_dotnet_link() {
70     cd -P "$(dirname "$1")"
71     dotnet_file="$PWD/$(basename "$1")"
72     while [[ -h "$dotnet_file" ]]; do
73         cd -P "$(dirname "$dotnet_file")"
74         dotnet_file="$(readlink "$dotnet_file")"
75         cd -P "$(dirname "$dotnet_file")"
76         dotnet_file="$PWD/$(basename "$dotnet_file")"
77     done
78     echo $PWD
79 }
80
81 function error_permission_denied() {
82     echo "No permission to install manifest. Try again with sudo."
83     exit 1
84 }
85
86 function ensure_directory() {
87     if [ ! -d $1 ]; then
88         mkdir -p $1 || error_permission_denied
89     fi
90     [ ! -w $1 ] && error_permission_denied
91 }
92
93 # Check dotnet install directory.
94 if [[ "$DOTNET_INSTALL_DIR" == "<auto>" ]]; then
95     if [[ -n "$DOTNET_ROOT" && -d "$DOTNET_ROOT" ]]; then
96         DOTNET_INSTALL_DIR=$DOTNET_ROOT
97     elif [[ -d "$DOTNET_DEFAULT_PATH_LINUX" ]]; then
98         DOTNET_INSTALL_DIR=$DOTNET_DEFAULT_PATH_LINUX
99     elif [[ -d "$DOTNET_DEFAULT_PATH_MACOS" ]]; then
100         DOTNET_INSTALL_DIR=$DOTNET_DEFAULT_PATH_MACOS
101     elif [[ -n "$(which dotnet)" ]]; then
102         DOTNET_INSTALL_DIR=$(read_dotnet_link $(which dotnet))
103     fi
104 fi
105 if [ ! -d $DOTNET_INSTALL_DIR ]; then
106     echo "No installed dotnet \`$DOTNET_INSTALL_DIR\`."
107     exit 1
108 fi
109
110 function getLatestVersion () {
111     for index in "${LatestVersionMap[@]}"; do
112          if [ "${index%%=*}" = "${1}" ]; then
113              echo "${index#*=}"
114          fi
115     done
116 }
117
118 # Check installed dotnet version
119 DOTNET_COMMAND="$DOTNET_INSTALL_DIR/dotnet"
120
121 if [ ! -x "$DOTNET_COMMAND" ]; then
122     echo "$DOTNET_COMMAND command not found"
123     exit 1
124 fi
125
126 function install_tizenworkload() {
127     DOTNET_VERSION=$1
128     IFS='.' read -r -a array <<< "$DOTNET_VERSION"
129     CURRENT_DOTNET_VERSION=${array[0]}
130     DOTNET_VERSION_BAND="${array[0]}.${array[1]}.${array[2]:0:1}00"
131     MANIFEST_NAME="$MANIFEST_BASE_NAME-$DOTNET_VERSION_BAND"
132
133     # Reset local variables
134     if [[ "$UPDATE_ALL_WORKLOADS" == "true" ]]; then
135         DOTNET_TARGET_VERSION_BAND="<auto>"
136         MANIFEST_VERSION="<latest>"
137     fi
138
139     # Check version band
140     if [[ "$DOTNET_TARGET_VERSION_BAND" == "<auto>" ]]; then
141         if [[ "$CURRENT_DOTNET_VERSION" -ge "7" ]]; then
142             if [[ "$DOTNET_VERSION" == *"-preview"* || $DOTNET_VERSION == *"-rc"* || $DOTNET_VERSION == *"-alpha"* ]] && [[ ${#array[@]} -ge 4 ]]; then
143                 DOTNET_TARGET_VERSION_BAND="$DOTNET_VERSION_BAND${array[2]:3}.${array[3]}"
144                 MANIFEST_NAME="$MANIFEST_BASE_NAME-$DOTNET_TARGET_VERSION_BAND"
145             else
146                 DOTNET_TARGET_VERSION_BAND=$DOTNET_VERSION_BAND
147             fi
148         else
149             DOTNET_TARGET_VERSION_BAND=$DOTNET_VERSION_BAND
150         fi
151     fi
152
153     # Check latest version of manifest.
154     if [[ "$MANIFEST_VERSION" == "<latest>" ]]; then
155         MANIFEST_VERSION=$(curl -s https://api.nuget.org/v3-flatcontainer/$MANIFEST_NAME/index.json | grep \" | tail -n 1 | tr -d '\r' | xargs)
156         if [ ! "$MANIFEST_VERSION" ]; then
157             MANIFEST_VERSION=$(getLatestVersion "$MANIFEST_NAME")
158             if [[ -n $MANIFEST_VERSION ]]; then
159                 echo "Return cached latest version: $MANIFEST_VERSION"
160             else
161                 echo "Failed to get the latest version of $MANIFEST_NAME."
162                 return
163             fi
164         fi
165     fi
166
167     # Check workload manifest directory.
168     SDK_MANIFESTS_DIR=$DOTNET_INSTALL_DIR/sdk-manifests/$DOTNET_TARGET_VERSION_BAND
169     ensure_directory $SDK_MANIFESTS_DIR
170
171     TMPDIR=$(mktemp -d)
172
173     echo "Installing $MANIFEST_NAME/$MANIFEST_VERSION to $SDK_MANIFESTS_DIR..."
174
175     # Download and extract the manifest nuget package.
176     curl -s -o $TMPDIR/manifest.zip -L https://www.nuget.org/api/v2/package/$MANIFEST_NAME/$MANIFEST_VERSION
177
178     unzip -qq -d $TMPDIR/unzipped $TMPDIR/manifest.zip
179     if [ ! -d $TMPDIR/unzipped/data ]; then
180         echo "No such files to install."
181         return
182     fi
183     chmod 744 $TMPDIR/unzipped/data/*
184
185     # Copy manifest files to dotnet sdk.
186     mkdir -p $SDK_MANIFESTS_DIR/samsung.net.sdk.tizen
187     cp -f $TMPDIR/unzipped/data/* $SDK_MANIFESTS_DIR/samsung.net.sdk.tizen/
188
189     if [ ! -f $SDK_MANIFESTS_DIR/samsung.net.sdk.tizen/WorkloadManifest.json ]; then
190         echo "Installation is failed."
191         return
192     fi
193
194     # Install workload packs.
195     if [ -f global.json ]; then
196         CACHE_GLOBAL_JSON="true"
197         mv global.json global.json.bak
198     else
199         CACHE_GLOBAL_JSON="false"
200     fi
201     dotnet new globaljson --sdk-version $DOTNET_VERSION
202     $DOTNET_INSTALL_DIR/dotnet workload install tizen --skip-manifest-update
203
204     # Clean-up
205     rm -fr $TMPDIR
206     rm global.json
207     if [[ "$CACHE_GLOBAL_JSON" == "true" ]]; then
208         mv global.json.bak global.json
209     fi
210
211     echo "Done installing Tizen workload $MANIFEST_VERSION"
212     echo ""
213 }
214
215 if [[ "$UPDATE_ALL_WORKLOADS" == "true" ]]; then
216     INSTALLED_DOTNET_SDKS=$($DOTNET_COMMAND --list-sdks | sed -n '/^6\|^7/p' | sed 's/ \[.*//g')
217 else
218     INSTALLED_DOTNET_SDKS=$($DOTNET_COMMAND --version)
219 fi
220
221 if [ -z "$INSTALLED_DOTNET_SDKS" ]; then
222     echo ".NET SDK version 6 or later is required to install Tizen Workload."
223 else
224     for DOTNET_SDK in $INSTALLED_DOTNET_SDKS; do
225         echo "Check Tizen Workload for sdk $DOTNET_SDK."
226         install_tizenworkload $DOTNET_SDK
227     done
228 fi
229
230 echo "DONE"