make/configure.vm

changeset 156
62f1a55535e7
child 158
4bde241c49b1
equal deleted inserted replaced
155:b907d8059290 156:62f1a55535e7
1 #!/bin/sh
2
3 PREFIX=/usr
4 EPREFIX=$PREFIX
5
6 BINDIR=
7 SBINDIR=
8 LIBDIR=
9 LIBEXECDIR=
10 DATADIR=
11 SYSCONFDIR=
12 SHAREDSTATEDIR=
13 LOCALSTATEDIR=
14 INCLUDEDIR=
15 INFODIR=
16 MANDIR=
17
18 OS=`uname -s`
19 OS_VERSION=`uname -r`
20
21 TEMP_DIR=".tmp-`uname -n`"
22 mkdir -p $TEMP_DIR
23 if [ $? -ne 0 ]; then
24 echo "Cannot create tmp dir"
25 echo "Abort"
26 fi
27 touch $TEMP_DIR/options
28 touch $TEMP_DIR/features
29
30 # features
31 #foreach( $feature in $features )
32 #if( ${feature.isDefault()} )
33 ${feature.getVarName()}=on
34 #end
35 #end
36
37 # help text
38 printhelp()
39 {
40 echo "Usage: $0 [OPTIONS]..."
41 cat << __EOF__
42 Installation directories:
43 --prefix=PREFIX path prefix for architecture-independent files
44 [/usr]
45 --exec-prefix=EPREFIX path prefix for architecture-dependent files
46 [PREFIX]
47
48 --bindir=DIR user executables [EPREFIX/bin]
49 --sbindir=DIR system admin executables [EPREFIX/sbin]
50 --libexecdir=DIR program executables [EPREFIX/libexec]
51 --sysconfdir=DIR system configuration files [PREFIX/etc]
52 --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
53 --localstatedir=DIR modifiable single-machine data [PREFIX/var]
54 --libdir=DIR object code libraries [EPREFIX/lib]
55 --includedir=DIR C header files [PREFIX/include]
56 --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
57 --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
58 --infodir=DIR info documentation [DATAROOTDIR/info]
59 --mandir=DIR man documentation [DATAROOTDIR/man]
60
61 #if( $options.size() > 0 )
62 Options:
63 #foreach( $opt in $options )
64 --${opt.getArgument()}=${opt.getValuesString()}
65 #end
66
67 #end
68 #if( $features.size() > 0 )
69 Optional Features:
70 #foreach( $feature in $features )
71 #if( $feature.default )
72 --disable-${feature.arg}
73 #else
74 --enable-${feature.arg}
75 #end
76 #end
77
78 #end
79 __EOF__
80 }
81
82 #
83 # parse arguments
84 #
85 #set( $D = '$' )
86 for ARG in $@
87 do
88 if [[ $ARG == --prefix=* ]]; then
89 PREFIX=${D}{ARG:9}
90 elif [[ $ARG = --exec-prefix=* ]]; then
91 EPREFIX=${D}{ARG:14}
92 elif [[ $ARG = --bindir=* ]]; then
93 BINDIR=${D}{ARG:9}
94 elif [[ $ARG = --sbindir=* ]]; then
95 SBINDIR=${D}{ARG:10}
96 elif [[ $ARG = --libdir=* ]]; then
97 LIBDIR=${D}{ARG:9}
98 elif [[ $ARG = --libexecdir=* ]]; then
99 LIBEXECDIR=${D}{ARG:13}
100 elif [[ $ARG = --datadir=* ]]; then
101 DATADIR=${D}{ARG:10}
102 elif [[ $ARG = --sysconfdir=* ]]; then
103 SYSCONFDIR=${D}{ARG:13}
104 elif [[ $ARG = --sharedstatedir=* ]]; then
105 SHAREDSTATEDIR=${D}{ARG:17}
106 elif [[ $ARG = --localstatedir=* ]]; then
107 LOCALSTATEDIR=${D}{ARG:16}
108 elif [[ $ARG = --includedir=* ]]; then
109 INCLUDEDIR=${D}{ARG:12}
110 elif [[ $ARG = --infodir=* ]]; then
111 INFODIR=${D}{ARG:10}
112 elif [[ $ARG = --mandir=* ]]; then
113 MANDIR=${D}{ARG:9}
114 elif [ $ARG = "--help" ]; then
115 printhelp
116 exit 0
117 #foreach( $opt in $options )
118 elif [[ $ARG == --${opt.getArgument()}=* ]]; then
119 ${opt.getVarName()}=${opt.getArgValue()}
120 #end
121 #foreach( $feature in $features )
122 elif [[ $ARG == --enable-${feature.arg} ]]; then
123 ${feature.getVarName()}=on
124 elif [[ $ARG == --disable-${feature.arg} ]]; then
125 unset ${feature.getVarName()}
126 #end
127 fi
128 done
129
130 # set dir variables
131 if [ -z $BINDIR ]; then
132 BINDIR=$EPREFIX/bin
133 fi
134 if [ -z $SBINDIR ]; then
135 SBINDIR=$EPREFIX/sbin
136 fi
137 if [ -z $LIBDIR ]; then
138 LIBDIRDIR=$EPREFIX/lib
139 fi
140 if [ -z $LIBEXEC ]; then
141 LIBExECDIR=$EPREFIX/libexec
142 fi
143 if [ -z $DATADIR ]; then
144 DATADIR=$PREFIX/share
145 fi
146 if [ -z $SYSCONFDIR]; then
147 SYSCONFDIR=$PREFIX/etc
148 fi
149 if [ -z $SHAREDSTATEDIR ]; then
150 SHAREDSTATEDIR=$PREFIX/com
151 fi
152 if [ -z $LOCALSTATEDIR ]; then
153 LOCALSTATEDIR=$PREFIX/var
154 fi
155 if [ -z $INCLUDEDIR ]; then
156 INCLUDEDIR=$PREFIX/include
157 fi
158 if [ -z $INFODIR ]; then
159 INFODIR=$PREFIX/info
160 fi
161 if [ -z $MANDIR ]; then
162 MANDIR=$PREFIX/man
163 fi
164
165 which pkg-config > /dev/null
166 if [ $? -ne 0 ]; then
167 PKG_CONFIG=pkg-config
168 else
169 PKG_CONFIG=false
170 fi
171
172 # Simple uname based platform detection
173 # $PLATFORM is used for platform dependent dependency selection
174 printf "detect platform... "
175 if [ $OS = SunOS ]; then
176 PLATFORM="solaris sunos unix svr4"
177 fi
178 if [ $OS = Linux ]; then
179 PLATFORM="linux unix"
180 fi
181 if [ $OS = FreeBSD ]; then
182 PLATFORM="freebsd bsd unix"
183 fi
184 if [ $OS = Darwin ]; then
185 PLATFORM="macos osx bsd unix"
186 fi
187 echo $OS | grep "MINGW" > /dev/null
188 if [ $? -eq 0 ]; then
189 PLATFORM="windows mingw"
190 fi
191
192 if [ -z "$PLATFORM" ]; then
193 PLATFORM="unix"
194 fi
195
196 for p in $PLATFORM
197 do
198 PLATFORM_NAME=$p
199 break
200 done
201 echo $PLATFORM_NAME
202
203 isplatform()
204 {
205 for p in $PLATFORM
206 do
207 if [ $p = $1 ]; then
208 return 0
209 fi
210 done
211 return 1
212 }
213
214 # generate config.mk and config.h
215 cat > $TEMP_DIR/config.mk << __EOF__
216 #
217 # config.mk generated by configure
218 #
219 __EOF__
220
221 echo > $TEMP_DIR/make.mk
222
223 ENV_CFLAGS=$CFLAGS
224 ENV_LDFLAGS=$LDFLAGS
225 ENV_CXXFLAGS=$CXXFLAGS
226
227 # Toolchain detection
228 # this will insert make vars to config.mk
229 source make/toolchain.sh
230
231 # add user specified flags to config.mk
232 echo >> $TEMP_DIR/config.mk
233 if [[ ! -z ${ENV_CFLAGS} ]]; then
234 echo "CFLAGS += $ENV_CFLAGS" >> $TEMP_DIR/config.mk
235 fi
236 if [[ ! -z ${ENV_CXXFLAGS} ]]; then
237 echo "CXXFLAGS += $ENV_CXXFLAGS" >> $TEMP_DIR/config.mk
238 fi
239 if [[ ! -z ${ENV_LDFLAGS} ]]; then
240 echo "LDFLAGS += $ENV_LDFLAGS" >> $TEMP_DIR/config.mk
241 fi
242
243 #
244 # DEPENDENCIES
245 #
246
247 #foreach( $dependency in $namedDependencies )
248 dependency_${dependency.name}()
249 {
250 printf "checking for ${dependency.name}... "
251 #foreach( $sub in $dependency.getSubdependencies() )
252 # dependency $sub.name $sub.getPlatformString()
253 while true
254 do
255 #if( $sub.platform )
256 if ! isplatform "${sub.platform}"; then
257 break
258 fi
259 #end
260 #if( $sub.pkgconfig.size() > 0 )
261 if [ -z "PKG_CONFIG" ]; then
262 break
263 fi
264 #end
265 #foreach( $pkg in $sub.pkgconfig )
266 if ! pkg-config $pkg.getPkgConfigParam() ; then
267 break
268 fi
269 CFLAGS+=" `pkg-config --cflags $pkg.getPkgConfigParam()`"
270 LDFLAGS+=" `pkg-config --libs $pkg.getPkgConfigParam()`"
271 #end
272 #foreach( $flags in $sub.flags )
273 #if( $flags.exec )
274 $flags.value > /dev/null
275 if [ $? -eq 0 ]; then
276 $flags.varName+=" `$flags.value`"
277 else
278 break
279 fi
280 #else
281 $flags.varName+="$flags.value"
282 #end
283 #end
284 #foreach( $test in $sub.tests )
285 $test > /dev/null
286 if [ $? -ne 0 ]; then
287 break
288 fi
289 #end
290 echo yes
291 return 0
292 done
293
294 #end
295 echo no
296 return 1
297 }
298 #end
299
300 DEPENDENCIES_FAILED=
301 ERROR=0
302 #if( $dependencies.size() > 0 )
303 # general dependencies
304 CFLAGS=
305 LDFLAGS=
306 #foreach( $dependency in $dependencies )
307 while true
308 do
309 #if( $dependency.platform )
310 if ! isplatform "${sub.platform}"; then
311 break
312 fi
313 #end
314 while true
315 do
316 #if( $dependency.pkgconfig.size() > 0 )
317 if [ -z "PKG_CONFIG" ]; then
318 ERROR=1
319 break
320 fi
321 #end
322 #foreach( $pkg in $dependency.pkgconfig )
323 printf "checking for pkg-config package $pkg.getPkgConfigParam()... "
324 if ! pkg-config $pkg.getPkgConfigParam() ; then
325 echo no
326 ERROR=1
327 break
328 fi
329 echo yes
330 CFLAGS+=" `pkg-config --cflags $pkg.getPkgConfigParam()`"
331 LDFLAGS+=" `pkg-config --libs $pkg.getPkgConfigParam()`"
332 #end
333
334 #foreach( $flags in $dependency.flags )
335 #if( $flags.exec )
336 $flags.value > /dev/null
337 if [ $? -ne 0 ]; then
338 $flags.varName+=" `$flags.value`"
339 else
340 ERROR=1
341 break
342 fi
343 #else
344 $flags.varName+="$flags.value"
345 #end
346 #end
347
348 break
349 done
350
351 break
352 done
353 #end
354
355 # add general dependency flags to config.mk
356 echo >> $TEMP_DIR/config.mk
357 if [[ ! -z ${CFLAGS} ]]; then
358 echo "CFLAGS += $CFLAGS" >> $TEMP_DIR/config.mk
359 fi
360 if [[ ! -z ${CXXFLAGS} ]]; then
361 echo "CXXFLAGS += $CXXFLAGS" >> $TEMP_DIR/config.mk
362 fi
363 if [[ ! -z ${LDFLAGS} ]]; then
364 echo "LDFLAGS += $LDFLAGS" >> $TEMP_DIR/config.mk
365 fi
366 #end
367
368 #
369 # OPTION VALUES
370 #
371 #foreach( $opt in $options )
372 #foreach( $val in $opt.values )
373 ${val.func}()
374 {
375 VERR=0
376 #foreach( $dep in $val.dependencies )
377 dependency_$dep
378 if [ $? -ne 0 ]; then
379 VERR=1
380 fi
381 #end
382 if [ $VERR -ne 0 ]; then
383 return 1
384 fi
385 #foreach( $def in $val.defines )
386 CFLAGS+=" ${def.toFlags()}"
387 #end
388 #if( $val.hasMake() )
389 cat >> $TEMP_DIR/make.mk << __EOF__
390 $val.make
391 __EOF__
392 #end
393 return 0
394 }
395 #end
396 #end
397
398 #
399 # TARGETS
400 #
401 CFLAGS=
402 CXXFLAGS=
403 LDFLAGS=
404
405 #foreach( $target in $targets )
406 #if ( $target.name )
407 # Target: $target.name
408 #else
409 # Target
410 #end
411 CFLAGS=
412 LDFLAGS=
413 CXXFLAGS=
414
415 #foreach( $dependency in $target.dependencies )
416 dependency_$dependency
417 if [ $? -ne 0 ]; then
418 DEPENDENCIES_FAILED+="${dependency} "
419 ERROR=1
420 fi
421 #end
422
423 #foreach( $opt in $target.options )
424 # Option: --${opt.argument}
425 if [ -z ${D}${opt.getVarName()} ]; then
426 SAVED_ERROR=$ERROR
427 SAVED_DEPENDENCIES_FAILED=$DEPENDENCIES_FAILED
428 ERROR=0
429 while true
430 do
431 #foreach( $optdef in $opt.defaults )
432 #if( $optdef.platform )
433 if isplatform "$optdef.platform"; then
434 #end
435 $optdef.func
436 if [ $? -eq 0 ]; then
437 echo " ${opt.argument}: ${optdef.valueName}" >> $TEMP_DIR/options
438 ERROR=0
439 break
440 fi
441 #if( $optdef.platform )
442 fi
443 #end
444 #end
445 break
446 done
447 if [ $ERROR -ne 0 ]; then
448 SAVED_ERROR=1
449 fi
450 ERROR=$SAVED_ERROR
451 DEPENDENCIES_FAILED=$SAVED_DEPENDENCIES_FAILED=
452 else
453 if false; then
454 false
455 #foreach( $optval in $opt.values )
456 elif [ ${D}${opt.getVarName()} = "${optval.value}" ]; then
457 echo " ${opt.argument}: ${D}${opt.getVarName()}" >> $TEMP_DIR/options
458 $optval.func
459 if [ $? -ne 0 ]; then
460 ERROR=1
461 fi
462 #end
463 fi
464 fi
465 #end
466
467 echo >> $TEMP_DIR/config.mk
468 if [[ ! -z ${CFLAGS} ]]; then
469 echo "${target.getCFlags()} += $CFLAGS" >> $TEMP_DIR/config.mk
470 fi
471 if [[ ! -z ${CXXFLAGS} ]]; then
472 echo "${target.getCXXFlags()} += $CXXFLAGS" >> $TEMP_DIR/config.mk
473 fi
474 if [[ ! -z ${LDFLAGS} ]]; then
475 echo "${target.getLDFlags()} += $LDFLAGS" >> $TEMP_DIR/config.mk
476 fi
477
478 #end
479 if [ $ERROR -ne 0 ]; then
480 echo
481 echo "Error: Unresolved dependencies"
482 echo $DEPENCIES_FAILED
483 rm -Rf $TEMP_DIR
484 exit 1
485 fi
486
487 echo "configure finished"
488 echo
489 echo "Build Config:"
490 echo " PREFIX: $PREFIX"
491 echo " TOOLCHAIN: $TOOLCHAIN_NAME"
492 #if ( $options.size() > 0 )
493 echo "Options:"
494 cat $TEMP_DIR/options
495 #end
496 echo
497 cat $TEMP_DIR/config.mk $TEMP_DIR/make.mk > config.mk
498 rm -Rf $TEMP_DIR
499
500

mercurial