Unpack dotnet sdk zipfile and add documentation file to nupkg
[platform/core/dotnet/build-tools.git] / Tools / dotnet-build.sh
1 #!/bin/bash
2
3 usage() {
4   echo "usage: "
5   echo " $0 restore <project> [-s <source>] ..."
6   echo " $0 build <project> [-c <configuration>] ..."
7   echo " $0 pack <project> [-c <configuration>] [-v <version>] ..."
8   echo " $0 install <project> [-t <type>]"
9 }
10
11 exit_on_error() {
12   if [ $1 -ne 0 ]; then
13     echo "Error $1"
14     exit $1
15   fi
16 }
17
18 retry() {
19   local CMD=$1; shift
20   local RETRY=$1; shift
21   local RET=0
22   local n=0
23   until [ $n -ge $RETRY ]; do
24     if [ $n -gt 0 ]; then
25       sleep 2
26       echo "Retry $n ....."
27     fi
28     echo "+ $CMD $@"
29     $CMD $@
30     RET=$?
31     if [ $RET -eq 0 ]; then
32       break
33     fi
34     n=$[$n+1]
35   done
36   exit_on_error $RET
37 }
38
39 run_nuget() {
40   retry nuget 3 $@
41 }
42
43 run_xbuild() {
44   echo "+ xbuild $@"
45   xbuild $@
46   exit_on_error $?
47 }
48
49 run_dotnet() {
50   echo "+ dotnet $@"
51   dotnet $@
52   exit_on_error $?
53 }
54
55 build_project() {
56   local CSPROJ=$1; shift
57
58   local PROJNAME=${CSPROJ%.*}
59   local PROJECT_JSON=$PROJNAME.project.json
60   if [ -f $PROJECT_JSON ]; then
61     run_nuget restore $PROJECT_JSON
62   fi
63   run_xbuild $CSPROJ /p:Configuration=$CONFIGURATION $@
64 }
65
66 cmd_restore() {
67   if $USE_DOTNET_CLI; then
68     local OPTS=""
69     [ -n "$SOURCE" ] && OPTS="$OPTS -s $SOURCE"
70     run_dotnet restore $PROJECT $OPTS $@
71   else
72     if [[ $PROJECT_TYPE == "dir" ]]; then
73       local PROJFILES=$(find $PROJECT -name "*.project.json")
74       for p in $PROJFILES; do
75         run_nuget restore $p $@
76       done
77     else
78       run_nuget restore $PROJECT $@
79     fi
80   fi
81 }
82
83 cmd_build() {
84   if $USE_DOTNET_CLI; then
85     cmd_restore # restore first
86     local OPTS=""
87     [ -n "$CONFIGURATION" ] && OPTS="$OPTS -c $CONFIGURATION"
88     [ -n "$VERSION" ] && OPTS="$OPTS /p:Version=$VERSION"
89     run_dotnet build $PROJECT $OPTS $@
90   else
91     if [[ $PROJECT_TYPE == "dir" ]]; then
92       local PROJFILES=$(find $PROJECT -name "*.csproj")
93       for p in $PROJFILES; do
94         build_project $p $@
95       done
96     elif [[ $PROJECT_TYPE == "sln" ]]; then
97       run_xbuild $PROJECT /p:Configuration=$CONFIGURATION $@
98     elif [[ $PROJECT_TYPE == "csproj" ]]; then
99       build_project $PROJECT $@
100     fi
101   fi
102 }
103
104 cmd_pack() {
105   if $USE_DOTNET_CLI; then
106     local OPTS=""
107     [ -n "$CONFIGURATION" ] && OPTS="$OPTS -c $CONFIGURATION"
108     [ -n "$VERSION" ] && OPTS="$OPTS /p:Version=$VERSION"
109     run_dotnet pack $PROJECT $OPTS $@
110   else
111     local NUSPEC=($PROJECT)
112     if [ -d $PROJECT ]; then
113       NUSPEC=($(find $PROJECT -name "*.nuspec"))
114     fi
115     for x in ${NUSPEC[@]}; do
116       run_nuget pack $x -Version $VERSION -Properties Configuration=$CONFIGURATION $@
117     done
118   fi
119 }
120
121 cmd_install() {
122   local DEST=$1; shift
123
124   mkdir -p $DEST
125
126   if [[ $TYPE == "assembly" ]]; then
127     find $PROJECT/bin -name $PROJECT.dll -exec install -p -m 644 {} $DEST \;
128   elif [[ $TYPE == "nupkg" ]]; then
129     find . -name "$PROJECT.[0-9]*.nupkg" -exec install -p -m 644 {} $DEST \;
130   fi
131 }
132
133 cmd_nuspec_addfile() {
134   local SRC=$1; shift
135   local TARGET=$1; shift
136
137   CHK_FILES=$(xmlstarlet sel -t -v "count(/package/files)" $PROJECT)
138   if [ $CHK_FILES -eq 0 ]; then
139     xmlstarlet ed -L -s "/package" -t elem -n "files" -v "" $PROJECT
140   fi
141
142   xmlstarlet ed -L -s "/package/files" -t elem -n "file" -v "" \
143                 -i "/package/files/file[last()]" -t attr -n "src" -v "$SRC" \
144                 -i "/package/files/file[last()]" -t attr -n "target" -v "$TARGET" \
145                 $PROJECT
146 }
147
148 #########################################################################
149
150 # Parse arguments
151
152 while getopts "s:c:v:t:" o; do
153   case "$o" in
154     s) SOURCE=${OPTARG} ;;
155     c) CONFIGURATION=${OPTARG} ;;
156     v) VERSION=${OPTARG} ;;
157     t) TYPE=${OPTARG} ;;
158     *) usage; exit 1 ;;
159   esac
160 done
161 shift $((OPTIND-1))
162
163 if [ $# -lt 2 ]; then
164   usage; exit 1
165 fi
166
167 CMD=$1; shift
168 PROJECT=$1; shift
169
170 # Check whether the project can be built using dotnet-cli
171 PROJECT_TYPE=""
172 USE_DOTNET_CLI=false
173 if [ -f $PROJECT ]; then
174   if [[ $PROJECT == *".sln" ]]; then
175     PROJECT_TYPE="sln"
176     VS_VERSION=$(grep -E "^VisualStudioVersion" $PROJECT | cut -f2 -d= | xargs)
177     if [[ $VS_VERSION == "15."* ]]; then
178       USE_DOTNET_CLI=true
179     fi
180   elif [[ $PROJECT == *".csproj" ]]; then
181     PROJECT_TYPE="csproj"
182     RET=$(grep "Microsoft.NET.Sdk" $PROJECT | wc -l)
183     if [ $RET -gt 0 ]; then
184       USE_DOTNET_CLI=true
185     fi
186   elif [[ $PROJECT == *".project.json" ]]; then
187     PROJECT_TYPE="project.json"
188   fi
189 elif [ -d $PROJECT ]; then
190   PROJECT_TYPE="dir"
191   RET=$(find $PROJECT -name "*.project.json" | wc -l)
192   if [ $RET -eq 0 ]; then
193     CSPROJS=$(find $PROJECT -name "*.csproj")
194     for p in $CSPROJS; do
195       RET=$(grep "Microsoft.NET.Sdk" $p | wc -l)
196       if [ $RET -gt 0 ]; then
197         USE_DOTNET_CLI=true
198         break;
199       fi
200     done
201   fi
202 fi
203
204 # Disable telemetry of dotnet
205 export DOTNET_CLI_TELEMETRY_OPTOUT=1
206
207 # To build PCL projects ReferenceAssemblyRoot should be set.
208 # dotnet-cli will find reference assemblies for PCL in this path.
209 export ReferenceAssemblyRoot=/usr/lib/mono/xbuild-frameworks
210
211 # Dump
212 echo "----------------------------------------------"
213 echo "CMD=$CMD"
214 echo "PROJECT=$PROJECT"
215 echo "PROJECT_TYPE=$PROJECT_TYPE"
216 echo "USE_DOTNET_CLI=$USE_DOTNET_CLI"
217 echo "SOURCE=$SOURCE"
218 echo "CONFIGURATION=$CONFIGURATION"
219 echo "VERSION=$VERSION"
220 echo "TYPE=$TYPE"
221 echo "REST ARGS=$@"
222 echo "----------------------------------------------"
223
224 case $CMD in
225   restore) cmd_restore $@ ;;
226   build) cmd_build $@ ;;
227   pack) cmd_pack $@ ;;
228   install) cmd_install $@ ;;
229   nuspec_addfile) cmd_nuspec_addfile $@ ;;
230   *) usage; exit 1 ;;
231 esac