1 #!/bin/sh
2
3 # create temporary directory
4 TEMP_DIR=".tmp-`uname -n`"
5 rm -Rf "$TEMP_DIR"
6 if mkdir -p "$TEMP_DIR"; then
7 :
8 else
9 echo "Cannot create tmp dir $TEMP_DIR"
10 echo "Abort"
11 exit 1
12 fi
13 touch "$TEMP_DIR/options"
14 touch "$TEMP_DIR/features"
15
16 # define standard variables
17 # also define standard prefix (this is where we will search for config.site)
18 prefix=/usr
19 exec_prefix=
20 bindir=
21 sbindir=
22 libdir=
23 libexecdir=
24 datarootdir=
25 datadir=
26 sysconfdir=
27 sharedstatedir=
28 localstatedir=
29 runstatedir=
30 includedir=
31 infodir=
32 localedir=
33 mandir=
34
35 # custom variables
36 #foreach( $var in $vars )
37 #if( $var.exec )
38 ${var.varName}=`${var.value}`
39 #else
40 ${var.varName}="${var.value}"
41 #end
42 #end
43
44 # features
45 #foreach( $feature in $features )
46 #if( ${feature.auto} )
47 ${feature.varName}=auto
48 #end
49 #end
50
51 # clean abort
52 abort_configure()
53 {
54 rm -Rf "$TEMP_DIR"
55 exit 1
56 }
57
58 # help text
59 printhelp()
60 {
61 echo "Usage: $0 [OPTIONS]..."
62 cat << __EOF__
63 Installation directories:
64 --prefix=PREFIX path prefix for architecture-independent files
65 [/usr]
66 --exec-prefix=EPREFIX path prefix for architecture-dependent files
67 [PREFIX]
68
69 --bindir=DIR user executables [EPREFIX/bin]
70 --sbindir=DIR system admin executables [EPREFIX/sbin]
71 --libexecdir=DIR program executables [EPREFIX/libexec]
72 --sysconfdir=DIR system configuration files [PREFIX/etc]
73 --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
74 --localstatedir=DIR modifiable single-machine data [PREFIX/var]
75 --runstatedir=DIR run-time variable data [LOCALSTATEDIR/run]
76 --libdir=DIR object code libraries [EPREFIX/lib]
77 --includedir=DIR C header files [PREFIX/include]
78 --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
79 --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
80 --infodir=DIR info documentation [DATAROOTDIR/info]
81 --mandir=DIR man documentation [DATAROOTDIR/man]
82 --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
83
84 #if( $options.size() > 0 )
85 Options:
86 --debug add extra compile flags for debug builds
87 --release add extra compile flags for release builds
88 #foreach( $opt in $options )
89 --${opt.argument}=${opt.valuesString}
90 #end
91
92 #end
93 #if( $features.size() > 0 )
94 Optional Features:
95 #foreach( $feature in $features )
96 ${feature.helpText}
97 #end
98
99 #end
100 __EOF__
101 }
102
103 #
104 # parse arguments
105 #
106 BUILD_TYPE="default"
107 #set( $D = '$' )
108 for ARG in "$@"
109 do
110 case "$ARG" in
111 "--prefix="*) prefix=${D}{ARG#--prefix=} ;;
112 "--exec-prefix="*) exec_prefix=${D}{ARG#--exec-prefix=} ;;
113 "--bindir="*) bindir=${D}{ARG#----bindir=} ;;
114 "--sbindir="*) sbindir=${D}{ARG#--sbindir=} ;;
115 "--libdir="*) libdir=${D}{ARG#--libdir=} ;;
116 "--libexecdir="*) libexecdir=${D}{ARG#--libexecdir=} ;;
117 "--datarootdir="*) datarootdir=${D}{ARG#--datarootdir=} ;;
118 "--datadir="*) datadir=${D}{ARG#--datadir=} ;;
119 "--sysconfdir="*) sysconfdir=${D}{ARG#--sysconfdir=} ;;
120 "--sharedstatedir="*) sharedstatedir=${D}{ARG#--sharedstatedir=} ;;
121 "--localstatedir="*) localstatedir=${D}{ARG#--localstatedir=} ;;
122 "--includedir="*) includedir=${D}{ARG#--includedir=} ;;
123 "--infodir="*) infodir=${D}{ARG#--infodir=} ;;
124 "--mandir"*) mandir=${D}{ARG#--mandir} ;;
125 "--localedir"*) localedir=${D}{ARG#--localedir} ;;
126 "--help"*) printhelp; abort_configure ;;
127 "--debug") BUILD_TYPE="debug" ;;
128 "--release") BUILD_TYPE="release" ;;
129 #foreach( $opt in $options )
130 "--${opt.argument}="*) ${opt.varName}=${D}{ARG#--${opt.argument}=} ;;
131 #end
132 #foreach( $feature in $features )
133 "--enable-${feature.arg}") ${feature.varName}=on ;;
134 "--disable-${feature.arg}") unset ${feature.varName} ;;
135 #end
136 "-"*) echo "unknown option: $ARG"; abort_configure ;;
137 esac
138 done
139
140 ## Begin unparsed content. **
141 #[[
142
143 # set defaults for dir variables
144 : ${exec_prefix:="$prefix"}
145 : ${bindir:='${exec_prefix}/bin'}
146 : ${sbindir:='${exec_prefix}/sbin'}
147 : ${libdir:='${exec_prefix}/lib'}
148 : ${libexecdir:='${exec_prefix}/libexec'}
149 : ${datarootdir:='${prefix}/share'}
150 : ${datadir:='${datarootdir}'}
151 : ${sysconfdir:='${prefix}/etc'}
152 : ${sharedstatedir:='${prefix}/com'}
153 : ${localstatedir:='${prefix}/var'}
154 : ${runstatedir:='${localstatedir}/run'}
155 : ${includedir:='${prefix}/include'}
156 : ${infodir:='${datarootdir}/info'}
157 : ${mandir:='${datarootdir}/man'}
158 : ${localedir:='${datarootdir}/locale'}
159
160 # check if a config.site exists and load it
161 if [ -n "$CONFIG_SITE" ]; then
162 # CONFIG_SITE may contain space separated file names
163 for cs in $CONFIG_SITE; do
164 printf "loading defaults from $cs... "
165 . "$cs"
166 echo ok
167 done
168 elif [ -f "$prefix/share/config.site" ]; then
169 printf "loading site defaults... "
170 . "$prefix/share/config.site"
171 echo ok
172 elif [ -f "$prefix/etc/config.site" ]; then
173 printf "loading site defaults... "
174 . "$prefix/etc/config.site"
175 echo ok
176 fi
177
178 # Test for availability of pkg-config
179 PKG_CONFIG=`command -v pkg-config`
180 : ${PKG_CONFIG:="false"}
181
182 # Simple uname based platform detection
183 # $PLATFORM is used for platform dependent dependency selection
184 OS=`uname -s`
185 OS_VERSION=`uname -r`
186 printf "detect platform... "
187 if [ "$OS" = "SunOS" ]; then
188 PLATFORM="solaris sunos unix svr4"
189 elif [ "$OS" = "Linux" ]; then
190 PLATFORM="linux unix"
191 elif [ "$OS" = "FreeBSD" ]; then
192 PLATFORM="freebsd bsd unix"
193 elif [ "$OS" = "OpenBSD" ]; then
194 PLATFORM="openbsd bsd unix"
195 elif [ "$OS" = "NetBSD" ]; then
196 PLATFORM="netbsd bsd unix"
197 elif [ "$OS" = "Darwin" ]; then
198 PLATFORM="macos osx bsd unix"
199 elif echo "$OS" | grep -i "MINGW" > /dev/null; then
200 PLATFORM="windows mingw"
201 fi
202 : ${PLATFORM:="unix"}
203
204 PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -`
205 echo "$PLATFORM_NAME"
206
207 isplatform()
208 {
209 for p in $PLATFORM
210 do
211 if [ "$p" = "$1" ]; then
212 return 0
213 fi
214 done
215 return 1
216 }
217 notisplatform()
218 {
219 for p in $PLATFORM
220 do
221 if [ "$p" = "$1" ]; then
222 return 1
223 fi
224 done
225 return 0
226 }
227 istoolchain()
228 {
229 for t in $TOOLCHAIN
230 do
231 if [ "$t" = "$1" ]; then
232 return 0
233 fi
234 done
235 return 1
236 }
237 notistoolchain()
238 {
239 for t in $TOOLCHAIN
240 do
241 if [ "$t" = "$1" ]; then
242 return 1
243 fi
244 done
245 return 0
246 }
247 ]]#
248 ## End of unparsed content **
249
250 # generate vars.mk
251 cat > "$TEMP_DIR/vars.mk" << __EOF__
252 prefix=$prefix
253 exec_prefix=$exec_prefix
254 bindir=$bindir
255 sbindir=$sbindir
256 libdir=$libdir
257 libexecdir=$libexecdir
258 datarootdir=$datarootdir
259 datadir=$datadir
260 sysconfdir=$sysconfdir
261 sharedstatedir=$sharedstatedir
262 localstatedir=$localstatedir
263 runstatedir=$runstatedir
264 includedir=$includedir
265 infodir=$infodir
266 mandir=$mandir
267 localedir=$localedir
268 #foreach( $var in $vars )
269 ${var.varName}=${D}${var.varName}
270 #end
271 __EOF__
272
273 # toolchain detection utilities
274 . make/toolchain.sh
275
276 #
277 # DEPENDENCIES
278 #
279
280 # check languages
281 lang_c=
282 lang_cpp=
283 #foreach( $lang in $languages )
284 if detect_${lang}_compiler ; then
285 lang_${lang}=1
286 fi
287 #end
288
289 # create buffer for make variables required by dependencies
290 echo > "$TEMP_DIR/make.mk"
291
292 test_pkg_config()
293 {
294 if "$PKG_CONFIG" --exists "$1" ; then :
295 else return 1 ; fi
296 if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
297 else return 1 ; fi
298 if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
299 else return 1 ; fi
300 if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
301 else return 1 ; fi
302 return 0
303 }
304
305 print_check_msg()
306 {
307 if [ -z "$1" ]; then
308 shift
309 printf "$@"
310 fi
311 }
312
313 #foreach( $dependency in $namedDependencies )
314 dependency_error_${dependency.id}()
315 {
316 print_check_msg "${D}dep_checked_${dependency.id}" "checking for ${dependency.name}... "
317 #foreach( $sub in $dependency.subdependencies )
318 # dependency $sub.fullName
319 while true
320 do
321 #if( $sub.platform )
322 if notisplatform "${sub.platform}"; then
323 break
324 fi
325 #end
326 #if( $sub.toolchain )
327 if notistoolchain "${sub.toolchain}"; then
328 break
329 fi
330 #end
331 #foreach( $np in $sub.notList )
332 if isplatform "${np}" || istoolchain "${np}"; then
333 break
334 fi
335 #end
336 #foreach( $lang in $sub.lang )
337 if [ -z "$lang_${lang}" ] ; then
338 break
339 fi
340 #end
341 #if( $sub.pkgconfig.size() > 0 )
342 if [ -z "$PKG_CONFIG" ]; then
343 break
344 fi
345 #end
346 #foreach( $test in $sub.tests )
347 if $test > /dev/null ; then
348 :
349 else
350 break
351 fi
352 #end
353 #foreach( $pkg in $sub.pkgconfig )
354 if test_pkg_config "$pkg.name" "$pkg.atleast" "$pkg.exact" "$pkg.max" ; then
355 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags $pkg.name`"
356 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs $pkg.name`"
357 else
358 break
359 fi
360 #end
361 #foreach( $flags in $sub.flags )
362 #if( $flags.exec )
363 if tmp_flags=`$flags.value` ; then
364 TEMP_$flags.varName="$TEMP_$flags.varName $tmp_flags"
365 else
366 break
367 fi
368 #else
369 TEMP_$flags.varName="$TEMP_$flags.varName $flags.value"
370 #end
371 #end
372 #if ( $sub.make.length() > 0 )
373 cat >> $TEMP_DIR/make.mk << __EOF__
374 # Dependency: $dependency.name
375 $sub.make
376 __EOF__
377 #end
378 print_check_msg "${D}dep_checked_${dependency.id}" "yes\n"
379 dep_checked_${dependency.id}=1
380 return 1
381 done
382
383 #end
384 print_check_msg "${D}dep_checked_${dependency.id}" "no\n"
385 dep_checked_${dependency.id}=1
386 return 0
387 }
388 #end
389
390 # start collecting dependency information
391 echo > "$TEMP_DIR/flags.mk"
392
393 DEPENDENCIES_FAILED=
394 ERROR=0
395 #if( $dependencies.size() > 0 )
396 # unnamed dependencies
397 TEMP_CFLAGS=
398 TEMP_CXXFLAGS=
399 TEMP_LDFLAGS=
400 #foreach( $dependency in $dependencies )
401 while true
402 do
403 #if( $dependency.platform )
404 if notisplatform "${dependency.platform}"; then
405 break
406 fi
407 #end
408 #if( $dependency.toolchain )
409 if notistoolchain "${dependency.toolchain}"; then
410 break
411 fi
412 #end
413 #foreach( $np in $dependency.notList )
414 if isplatform "${np}" || istoolchain "${np}"; then
415 break
416 fi
417 #end
418 while true
419 do
420 #foreach( $lang in $dependency.lang )
421 if [ -z "$lang_${lang}" ] ; then
422 ERROR=1
423 break
424 fi
425 #end
426 #if( $dependency.pkgconfig.size() > 0 )
427 if [ -z "$PKG_CONFIG" ]; then
428 ERROR=1
429 break
430 fi
431 #end
432 #foreach( $pkg in $dependency.pkgconfig )
433 print_check_msg "${D}dep_pkgconfig_checked_${pkg.id}" "checking for pkg-config package $pkg.name... "
434 if test_pkg_config "$pkg.name" "$pkg.atleast" "$pkg.exact" "$pkg.max" ; then
435 print_check_msg "${D}dep_pkgconfig_checked_${pkg.id}" "yes\n"
436 dep_pkgconfig_checked_${pkg.id}=1
437 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags $pkg.name`"
438 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs $pkg.name`"
439 else
440 print_check_msg "${D}dep_pkgconfig_checked_${pkg.id}" "no\n"
441 dep_pkgconfig_checked_${pkg.id}=1
442 ERROR=1
443 break
444 fi
445 #end
446
447 #foreach( $flags in $dependency.flags )
448 #if( $flags.exec )
449 $flags.value > /dev/null
450 if tmp_flags=`$flags.value` ; then
451 TEMP_$flags.varName="$TEMP_$flags.varName $tmp_flags"
452 else
453 ERROR=1
454 break
455 fi
456 #else
457 TEMP_$flags.varName="$TEMP_$flags.varName $flags.value"
458 #end
459 #end
460 #if ( $dependency.make.length() > 0 )
461 cat >> "$TEMP_DIR/make.mk" << __EOF__
462 $dependency.make
463 __EOF__
464 #end
465 break
466 done
467 break
468 done
469 #end
470
471 # add general dependency flags to flags.mk
472 echo "# general flags" >> "$TEMP_DIR/flags.mk"
473 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
474 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
475 fi
476 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
477 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
478 fi
479 if [ -n "${TEMP_LDFLAGS}" ]; then
480 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
481 fi
482 #end
483
484 #
485 # OPTION VALUES
486 #
487 #foreach( $opt in $options )
488 #foreach( $val in $opt.values )
489 ${val.func}()
490 {
491 VERR=0
492 #foreach( $dep in $val.dependencies )
493 if dependency_error_$dep ; then
494 VERR=1
495 fi
496 #end
497 if [ $VERR -ne 0 ]; then
498 return 1
499 fi
500 #foreach( $def in $val.defines )
501 TEMP_CFLAGS="$TEMP_CFLAGS ${def.toFlags()}"
502 TEMP_CXXFLAGS="$TEMP_CXXFLAGS ${def.toFlags()}"
503 #end
504 #if( $val.hasMake() )
505 cat >> "$TEMP_DIR/make.mk" << __EOF__
506 $val.make
507 __EOF__
508 #end
509 return 0
510 }
511 #end
512 #end
513
514 #
515 # TARGETS
516 #
517
518 #foreach( $target in $targets )
519 echo >> "$TEMP_DIR/flags.mk"
520 #if ( $target.name )
521 echo "configuring target: $target.name"
522 echo "# flags for target $target.name" >> "$TEMP_DIR/flags.mk"
523 #else
524 echo "configuring global target"
525 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
526 #end
527 TEMP_CFLAGS=
528 TEMP_CXXFLAGS=
529 TEMP_LDFLAGS=
530
531 #foreach( $dependency in $target.dependencies )
532 if dependency_error_$dependency; then
533 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} "
534 ERROR=1
535 fi
536 #end
537
538 # Features
539 #foreach( $feature in $target.features )
540 if [ -n "${D}${feature.varName}" ]; then
541 #foreach( $dependency in $feature.dependencies )
542 # check dependency
543 if dependency_error_$dependency ; then
544 # "auto" features can fail and are just disabled in this case
545 if [ "${D}${feature.varName}" = "auto" ]; then
546 DISABLE_${feature.varName}=1
547 else
548 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} "
549 ERROR=1
550 fi
551 fi
552 #end
553 if [ -n "$DISABLE_${feature.varName}" ]; then
554 unset ${feature.varName}
555 fi
556 fi
557 #end
558
559 #foreach( $opt in $target.options )
560 # Option: --${opt.argument}
561 if [ -z "${D}${opt.varName}" ]; then
562 echo "auto-detecting option '${opt.argument}'"
563 SAVED_ERROR="$ERROR"
564 SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED"
565 ERROR=1
566 while true
567 do
568 #foreach( $optdef in $opt.defaults )
569 #if( $optdef.platform )
570 if isplatform "$optdef.platform"; then
571 #end
572 if $optdef.func ; then
573 echo " ${opt.argument}: ${optdef.valueName}" >> "$TEMP_DIR/options"
574 ERROR=0
575 break
576 fi
577 #if( $optdef.platform )
578 fi
579 #end
580 #end
581 break
582 done
583 if [ $ERROR -ne 0 ]; then
584 SAVED_ERROR=1
585 SAVED_DEPENDENCIES_FAILED="option '${opt.argument}' $SAVED_DEPENDENCIES_FAILED"
586 fi
587 ERROR="$SAVED_ERROR"
588 DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED"
589 else
590 echo "checking option ${opt.argument} = ${D}${opt.varName}"
591 if false; then
592 false
593 #foreach( $optval in $opt.values )
594 elif [ "${D}${opt.varName}" = "${optval.value}" ]; then
595 echo " ${opt.argument}: ${D}${opt.varName}" >> $TEMP_DIR/options
596 if $optval.func ; then
597 :
598 else
599 ERROR=1
600 DEPENDENCIES_FAILED="option '${opt.argument}' $DEPENDENCIES_FAILED"
601 fi
602 #end
603 fi
604 fi
605 #end
606
607 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
608 echo "${target.cFlags} += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
609 fi
610 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
611 echo "${target.cxxFlags} += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
612 fi
613 if [ "$BUILD_TYPE" = "debug" ]; then
614 if [ -n "$lang_c" ]; then
615 echo '${target.cFlags} += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
616 fi
617 if [ -n "$lang_cpp" ]; then
618 echo '${target.cxxFlags} += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
619 fi
620 fi
621 if [ "$BUILD_TYPE" = "release" ]; then
622 if [ -n "$lang_c" ]; then
623 echo '${target.cFlags} += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
624 fi
625 if [ -n "$lang_cpp" ]; then
626 echo '${target.cxxFlags} += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
627 fi
628 fi
629 if [ -n "${TEMP_LDFLAGS}" ]; then
630 echo "${target.ldFlags} += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
631 fi
632
633 #end
634
635 # final result
636 if [ $ERROR -ne 0 ]; then
637 echo
638 echo "Error: Unresolved dependencies"
639 echo "$DEPENDENCIES_FAILED"
640 abort_configure
641 fi
642
643 echo "configure finished"
644 echo
645 echo "Build Config:"
646 echo " PREFIX: $prefix"
647 echo " TOOLCHAIN: $TOOLCHAIN_NAME"
648 #if ( $options.size() > 0 )
649 echo "Options:"
650 cat "$TEMP_DIR/options"
651 #end
652 #if ( $features.size() > 0 )
653 echo "Features:"
654 #foreach( $feature in $features )
655 if [ -n "${D}${feature.varName}" ]; then
656 echo " $feature.name: on"
657 else
658 echo " $feature.name: off"
659 fi
660 #end
661 #end
662 echo
663
664 # generate the config.mk file
665 cat > "$TEMP_DIR/config.mk" << __EOF__
666 #
667 # config.mk generated by configure
668 #
669
670 __EOF__
671 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
672 cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
673 rm -Rf "$TEMP_DIR"
674