Release 11.0.0.18109
[platform/core/csapi/tizenfx.git] / build.sh
1 #!/bin/bash -e
2
3 SCRIPT_DIR=$(dirname $(readlink -f $0))
4
5 CONFIGURATION=Release
6 SLN_NAME=_Build
7 SLN_FILE=$SCRIPT_DIR/$SLN_NAME.sln
8 OUTDIR=$SCRIPT_DIR/Artifacts
9
10 PROFILES=(mobile tv wearable)
11 TARGET_ASSEMBLY_DIR=/usr/share/dotnet.tizen/framework
12 TARGET_PRELOAD_DIR=/usr/share/dotnet.tizen/preload
13
14 source $SCRIPT_DIR/packaging/version.txt
15 VERSION_PREFIX=$(expr $NUGET_VERSION : '\([0-9]\+\.[0-9]\+\.[0-9]\+\)')
16
17 usage() {
18   echo "Usage: $0 [command] [args]"
19   echo "Commands:"
20   echo "    build [module]     Build a specific module"
21   echo "    full               Build all modules in src/ directory"
22   echo "    design             Build NUI Design module"
23   echo "    xamlbuild          Build NUI XamlBuild module"
24   echo "    dummy              Generate dummy assemblies of all modules"
25   echo "    pack [version]     Make a NuGet package with build artifacts"
26   echo "    install [target]   Install assemblies to the target device"
27   echo "    clean              Clean all artifacts"
28 }
29
30 prepare_solution() {
31   target=$1; [ -z "$target" ] && target="full"
32
33   dotnet new sln -n $SLN_NAME -o $SCRIPT_DIR --force
34   if [ "$target" == "public" -o "$target" == "full" ]; then
35     dotnet sln $SLN_FILE add $SCRIPT_DIR/src/*/*.csproj
36   fi
37   if [ "$target" == "internal" -o "$target" == "full" ]; then
38     dotnet sln $SLN_FILE add $SCRIPT_DIR/internals/src/*/*.csproj
39   fi
40   if [ "$target" == "design" ]; then
41     dotnet sln $SLN_FILE add $SCRIPT_DIR/src/*/*.Design.csproj
42   else
43     dotnet sln $SLN_FILE remove $SCRIPT_DIR/src/*/*.Design.csproj
44   fi
45   if [ "$target" == "xamlbuild" ]; then
46     dotnet sln $SLN_FILE add $SCRIPT_DIR/src/*/*.XamlBuild.csproj
47   else
48     dotnet sln $SLN_FILE remove $SCRIPT_DIR/src/*/*.XamlBuild.csproj
49   fi
50 }
51
52 cleanup_solution() {
53   rm -f $SLN_FILE
54 }
55
56 remove_intermediates() {
57   find $1 -type d \
58     \( -name obj -o -name bin \) -print0 | xargs -0 -I {} rm -fr "{}"
59 }
60
61 clean() {
62   remove_intermediates $SCRIPT_DIR/build/
63   remove_intermediates $SCRIPT_DIR/src/
64   remove_intermediates $SCRIPT_DIR/internals/src/
65   rm -fr $OUTDIR
66   rm -f msbuild.log
67   cleanup_solution
68 }
69
70 restore() {
71   if [ -d /nuget ]; then
72     dotnet restore -s /nuget $@
73   else
74     dotnet restore $@
75   fi
76 }
77
78 build() {
79   dotnet build --no-restore -c $CONFIGURATION /fl $@
80 }
81
82 copy_artifacts() {
83   mkdir -p $2
84   for proj in $(ls -d1 $1/*/); do
85     if [ -d $proj/bin/$CONFIGURATION ]; then
86       cp -fr $proj/bin/$CONFIGURATION/*/* $2
87     fi
88   done
89 }
90
91 build_artifacts() {
92   copy_artifacts $SCRIPT_DIR/src $OUTDIR/bin/public
93   copy_artifacts $SCRIPT_DIR/internals/src $OUTDIR/bin/internal
94
95   # move preload
96   mkdir -p $OUTDIR/preload
97   mv $OUTDIR/bin/public/*.preload $OUTDIR/preload 2>/dev/null || :
98   mv $OUTDIR/bin/internal/*.preload $OUTDIR/preload 2>/dev/null || :
99
100   # merge filelist
101   for profile in ${PROFILES[@]}; do
102     list=$(cat $OUTDIR/bin/public/*.$profile.filelist \
103                $OUTDIR/bin/internal/*.$profile.filelist \
104                | sort | uniq)
105     rm -f $OUTDIR/$profile.filelist
106     for item in $list; do
107       if [[ "$item" == *.preload ]]; then
108         echo $TARGET_PRELOAD_DIR/$item >> $OUTDIR/$profile.filelist
109       else
110         echo $TARGET_ASSEMBLY_DIR/$item >> $OUTDIR/$profile.filelist
111       fi
112     done
113   done
114 }
115
116 cmd_module_build() {
117   if [ -z "$1" ]; then
118     echo "No module specified."
119     exit 1
120   fi
121   module=$1; shift;
122   sources=(src internals/src)
123   for src in $sources; do
124     project=$SCRIPT_DIR/$src/$module/$module.csproj
125     echo $project
126     if [ -f "$project" ]; then
127       restore $project
128       build $project $@
129     fi
130   done
131 }
132
133 cmd_full_build() {
134   clean
135   prepare_solution full
136   restore $SLN_FILE $@
137   build $SLN_FILE $@
138   cleanup_solution
139   build_artifacts
140   cmd_dummy_build
141 }
142
143 cmd_design_build() {
144   prepare_solution design
145   restore $SLN_FILE
146   build $SLN_FILE $@
147   projects=$(dirname $(ls -1 $SCRIPT_DIR/src/*/*.Design.csproj))
148   for proj in $projects; do
149     if [ -d $proj/bin/$CONFIGURATION ]; then
150       cp -f $proj/bin/$CONFIGURATION/*/*.Design.dll $SCRIPT_DIR/pkg/Tizen.NET.API*/design/
151     fi
152   done
153   cleanup_solution
154 }
155
156 cmd_xamlbuild_build() {
157   prepare_solution xamlbuild
158   restore $SLN_FILE
159   build $SLN_FILE $@
160   projects=$(dirname $(ls -1 $SCRIPT_DIR/src/*/*.XamlBuild.csproj))
161   for proj in $projects; do
162     if [ -d $proj/bin/$CONFIGURATION ]; then
163       cp -f $proj/bin/$CONFIGURATION/*/*.XamlBuild.dll $SCRIPT_DIR/pkg/Tizen.NET.API*/xamlbuild/
164     fi
165   done
166   cleanup_solution
167 }
168
169 cmd_dummy_build() {
170   if [ ! -d $OUTDIR/bin/public/ref  ]; then
171     echo "No assemblies to read. Build TizenFX first."
172     exit 1
173   fi
174   mkdir -p $OUTDIR/bin/dummy
175   CACHE=`pwd`
176   cd $OUTDIR/bin/dummy
177   dotnet $SCRIPT_DIR/tools/bin/APITool.dll \
178          dummy $OUTDIR/bin/public/ref $OUTDIR/bin/dummy
179   cd $CACHE
180 }
181
182 cmd_pack() {
183   VERSION=$1
184   if [ -z "$VERSION" ]; then
185     pushd $SCRIPT_DIR > /dev/null
186     VERSION=$VERSION_PREFIX.$((10000+$(git rev-list --count HEAD)))
187     popd > /dev/null
188   fi
189
190   restore $SCRIPT_DIR/build/pack.csproj
191   nuspecs=$(find $SCRIPT_DIR/pkg/ -name "*.nuspec")
192   for nuspec in $nuspecs; do
193     dotnet pack --no-restore --no-build --nologo -o $OUTDIR \
194            $SCRIPT_DIR/build/pack.csproj \
195            /p:Version=$VERSION \
196            /p:NuspecFile=$(readlink -f $nuspec)
197   done
198 }
199
200 cmd_install() {
201   DEVICE_ID=$1
202
203   RUNTIME_ASSEMBLIES="$OUTDIR/bin/public/*.dll $OUTDIR/bin/internal/*.dll"
204
205   device_cnt=$(sdb devices | grep -v "List" | wc -l)
206
207   if [ $device_cnt -eq 0 ]; then
208     echo "No connected devices"
209     exit 1
210   fi
211
212   if [ $device_cnt -gt 1 ] && [ -z "$DEVICE_ID" ]; then
213     echo "Multiple devices are connected. Specify the device. (ex: ./build.sh install [device-id])"
214     sdb devices
215     exit 1
216   fi
217
218   SDB_OPTIONS=""
219   if [ -n "$DEVICE_ID" ]; then
220     SDB_OPTIONS="-s $DEVICE_ID"
221   fi
222
223   sdb $SDB_OPTIONS root on
224   sdb $SDB_OPTIONS shell mount -o remount,rw /
225   sdb $SDB_OPTIONS push $RUNTIME_ASSEMBLIES $TARGET_ASSEMBLY_DIR
226
227   nifile_cnt=$(sdb $SDB_OPTIONS shell find $TARGET_ASSEMBLY_DIR -name '*.ni.dll' | wc -l)
228   if [ $nifile_cnt -gt 0 ]; then
229     sdb $SDB_OPTIONS shell "rm -f $TARGET_ASSEMBLY_DIR/*.ni.dll"
230     sdb $SDB_OPTIONS shell dotnettool --ni-system
231     sdb $SDB_OPTIONS shell dotnettool --ni-regen-all-app
232   fi
233
234   sdb $SDB_OPTIONS shell chsmack -a '_' $TARGET_ASSEMBLY_DIR/*
235 }
236
237 cmd=$1; [ $# -gt 0 ] && shift;
238 case "$cmd" in
239   build|--build|-b) cmd_module_build $@ ;;
240   full |--full |-f) cmd_full_build $@ ;;
241   design|--design)  cmd_design_build $@ ;;
242   xamlbuild|--xamlbuild)  cmd_xamlbuild_build $@ ;;
243   dummy|--dummy|-d) cmd_dummy_build $@ ;;
244   pack |--pack |-p) cmd_pack $@ ;;
245   install |--install |-i) cmd_install $@ ;;
246   clean|--clean|-c) clean ;;
247   *) usage ;;
248 esac