da630c32be8e4e72617f94337f7e472c2b2c11e4
[projects.git] / tools / make / configure
1 #!/bin/bash
2 set -e
3
4 function echo_usage {
5         echo "usage: configure [options] <package>"
6         echo "  -a <arch>"
7         echo "  -c : configure"
8         echo "  -C <cross environment>"
9         echo "  -d : compile"
10         echo "  -i : install dir. default: /"
11         echo "  -I : print this info"
12         echo "  -p : pack default: do all"
13         echo "  -v : set version"
14         echo "  -V : version set by project"
15 }
16
17 function cmake_check {
18         pushd ../build >/dev/null
19                 # do checks
20                 if [ -e debian/$paket.build ]
21                 then
22                         echo "cmake is not compatible with other builds. Remove $paket.build"
23                         exit 1
24                 fi
25                 if [ -e debian/$paket.prebuild ]
26                 then
27                         echo "cmake is not compatible with other builds. Remove $paket.prebuild"
28                         exit 2
29                 fi
30                 
31                 if [ -n "$cross" ]
32                 then
33                         # inject cross toolset
34                         echo "set (CMAKE_MODULE_PATH $cross)" > CMakeLists.txt
35                         echo "include(toolset)" >> CMakeLists.txt
36                         cat debian/$paket.cmake >> CMakeLists.txt
37                 else
38                         cp debian/$paket.cmake CMakeLists.txt
39                 fi
40
41                 echo "make" > debian/$paket.build
42                 chmod 755 debian/$paket.build
43                 cmake .
44         popd >/dev/null
45 }
46 function check_unversioned {
47         # has to be called in the projects base directory
48         # result: "M" in stdout or nothing
49         set -e
50         
51         # check if build is running in a sandbox
52         if ! [ -f .cm.ignore ]
53         then
54                 # we create one
55                 echo ".cm.ignore" > .cm.ignore
56                 echo "debian.*" >> .cm.ignore
57                 echo "up.*" >> .cm.ignore
58         fi
59         
60         project=$(pwd)
61         project=${project##*/}
62         pushd .. >/dev/null
63                 mCM $project -b -an > /dev/null
64                 wc=$(wc $project.batch)
65                 rm $project.batch
66                 if [ "${wc:0:5}" != "0 0 0" ]
67                 then
68                         echo "M"
69                 fi
70         popd >/dev/null
71 }
72
73 function set_build {
74         set -e
75         if [ -e .svn ]
76         then
77                 version="0.0"
78                 build=$(svnversion)
79                 build=${build/:/-}
80                 build="$build$(check_unversioned)"
81         elif [ -e .git ]
82         then
83                 tag=$(git describe --tags --match "${paket}_*" 2>/dev/null) || true
84                 if test -z "$tag"
85                 then
86                         # try generic "v_" tag
87                         tag=$(git describe --tags --match "v_*" 2>/dev/null) || true
88                 fi
89                 if test -z "$tag"
90                 then
91                         tag="0.0-0TOP"
92                 fi
93                 changes=$(check_unversioned)
94                 tag="$tag$changes"
95                 version=${tag##*_}
96                 version=${version%%-*}
97                 build=${tag##*-}
98         else
99                 echo "No configuration system found. Cannot determine version."
100                 exit 1
101         fi
102 }
103
104 function check_version {
105         set -e
106         
107         vline=$(head -1 debian/$paket.changelog)
108         vline=${vline%-*}
109         clversion=${vline#*(}
110         if [ $version = "0.0" ]
111         then
112                 version=$clversion
113                 return
114         fi
115
116         # do no check on a modified git repos
117         if [ "${build: -1}" == "M" ]
118         then
119                 return
120         fi
121
122         if [ "$clversion" != $version ]
123         then
124                 echo "version mismatch: git: $version, changelog: $clversion"
125                 exit 1
126         fi
127 }
128
129 ##############################################################################
130 # Main program
131 ##############################################################################
132
133 install_dir="/"
134 while [ $OPTIND -le "$#" ]
135 do
136         if getopts "a:C:i:Iv:V" opt
137         then
138                 case $opt in
139                         a) ARCH=$OPTARG
140                                 ;;
141                         C) cross=$OPTARG
142                                 ;;
143                         i)      install_dir=$OPTARG
144                                 ;;
145                         I)      echo_usage
146                                 exit 0
147                                 ;;
148                         v)      optversion=$OPTARG
149                                 ;;
150                         V)      optversion="0.0"
151                                 ;;
152                         \?) echo "Invalid option: -$OPTARG"
153                                 echo_usage
154                                 exit 1
155                                 ;;
156                         :) echo "Option -$OPTARG requires an argument."
157                                 echo_usage
158                                 exit 1
159                                 ;;
160                 esac
161         else
162                 paket="${!OPTIND}"
163                 eval OPTIND=OPTIND+1
164         fi
165 done
166
167 if [ -z "$paket" ]
168 then
169         echo_usage
170         exit 1
171 fi
172
173 if [ -n "$ARCH" -a -n "$cross" ]
174 then
175         echo "invalid options: supply -a for multiarch or -C for explicit cross compile environment"
176         exit 1
177 fi
178
179 if [ ! -e Makefile ]
180 then
181         ln -s /usr/share/mbuild/rules Makefile
182 fi
183
184 # delete changelog and control
185 rm debian/changelog debian/control debian/README.debian debian/copyright 2>/dev/null || true
186
187 # mconfigure builds 2 environment files: setenv.sh + rules.pre
188 echo "paket=$paket" > debian/rules.pre
189 echo "INSTALL_DIR=$install_dir" >> debian/rules.pre
190 if [ -e debian/setenv.sh ]; then rm debian/setenv.sh; fi
191
192 if [ -n "$cross" ]
193 then
194         if [ ${cross:0:1} != "/" ]
195         then
196                 cross="/opt/cross/$cross"
197                 #export $cross
198         fi
199         if [ -f "$cross/setenv.sh" ]
200         then
201                 . "$cross/setenv.sh"
202                 cp $cross/setenv.sh debian/setenv.sh
203         fi
204         if [ -z "$ARCH" ]
205         then
206                 # determine architecture
207                 GNU_ARCH=${cross%-*} # assumed format: DEB_HOST_GNU_TYPE-g++version, e.g. arm-linux-gnueabihf-4.9
208                 GNU_ARCH=${GNU_ARCH##*/}
209                 arch_opt="-t $GNU_ARCH"
210         fi
211 fi
212
213 if [ -n "$ARCH" ]
214 then
215         arch_opt="-a $ARCH"
216 fi
217 dpkg-architecture $arch_opt >> debian/setenv.sh
218
219 echo "paket=$paket" >> debian/setenv.sh
220 echo "oldpack=\"$oldpack\"" >> debian/setenv.sh
221
222 set_build
223 if [ -z "$optversion" ]
224 then
225         check_version
226 else
227         version=$optversion
228 fi
229 echo "version=$version" >> debian/rules.pre
230 echo "build=$build" >> debian/rules.pre
231
232 # get repository name
233 #       tmp=$(pwd)
234 #       pwd=${tmp##*/}
235 #       pwd=${pwd,,*}
236 #       echo "pwd=$pwd" >> debian/rules.pre
237
238 echo "building $paket with version/build=$version-$build"
239
240 pushd debian >/dev/null
241 # ./debian -------------------------------------
242
243 ln -sf /usr/share/mbuild/rules .
244
245 if [ -e tmp ]
246 then
247         rm -rf tmp
248 fi
249
250 # check for pre/post installation scripts
251 if [ -f $paket.preinst ]
252 then
253         echo "add_inst_tgt += debian/tmp/DEBIAN/preinst" >> rules.pre
254 fi
255 if [ -f $paket.postinst ]
256 then
257             echo "add_inst_tgt += debian/tmp/DEBIAN/postinst" >> rules.pre
258 fi
259 if [ -f $paket.prerm ]
260 then
261             echo "add_inst_tgt += debian/tmp/DEBIAN/prerm" >> rules.pre
262 fi
263 if [ -f $paket.postrm ]
264 then
265             echo "add_inst_tgt += debian/tmp/DEBIAN/postrm" >> rules.pre
266 fi
267
268 # check for README.debian
269 if [ -f $paket.README.debian ]
270 then
271             cp $paket.README.debian README.debian
272 fi
273
274 mkdir -p tmp/DEBIAN
275
276 # add export to setenv.sh
277 sed -i "s/^/export /" setenv.sh
278
279 popd >/dev/null
280 # ./. ---------------------------------------------
281
282 # copy package control
283 if [ -f debian/$paket.control ]
284 then
285         # proceed
286         echo
287 else
288         echo "warning: control file not found"
289         echo "  this file is necessary for any package production."
290 fi
291
292 # build prepare
293 if [ -x debian/$paket.prepare ]
294 then
295         . debian/setenv.sh
296         debian/$paket.prepare
297 fi
298
299 # compile prepare
300 if [ -x debian/$paket.build -o -e debian/$paket.cmake ]
301 then
302     # build requrired
303         echo "BUILD=build" >> debian/rules.pre
304         if [ -n "$BUILD_DIR" ]
305         then
306                 BUILD_DIR=.
307         fi
308 else
309         echo "BUILD=nobuild" >> debian/rules.pre
310 fi
311 # .build
312 if [ -x debian/$paket.build ]
313 then
314         if [ -x debian/$paket.prebuild ]
315         then
316                 pushd $BUILD_DIR >/dev/null
317                         . debian/setenv.sh
318                         debian/$paket.prebuild
319                 popd >/dev/null
320         fi
321 fi
322 # .cmake
323 if [ -e debian/$paket.cmake ]
324 then
325         cmake_check
326 fi
327
328 # pack prepare
329 if [ -f debian/$paket.cp -a -f debian/$paket.control ]
330 then
331         echo "PACK=binary" >> debian/rules.pre
332         if grep "^Architecture: *all" debian/$paket.control >/dev/null
333         then
334                 echo "arch = all" >> debian/rules.pre
335                 echo 'BINARY_INDEP = copy ../$(paket)_$(version)-$(build)_all.deb' >> debian/rules.pre
336         else
337                 echo 'arch = ${DEB_HOST_ARCH}' >> debian/rules.pre
338                 echo "BINARY_ARCH = copy ../${paket}_$version-${build}_"'$(arch).deb' >> debian/rules.pre
339         fi
340         if ! [ -f debian/$paket.changelog ]
341         then
342                 echo "changelog_source = debian/default.changelog" >> debian/rules.pre
343                 if [ -f debian/default.changelog ]
344                 then
345                         rm debian/default.changelog
346                 fi
347         fi
348 elif [ -f debian/$paket.cp ]
349 then
350         echo "PACK=zip" >> debian/rules.pre
351 else
352         echo "PACK=version" >> debian/rules.pre
353 fi
354