make/configure.vm

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

mercurial