update uwproj
[mizunara.git] / make / configure.vm
1 #!/bin/sh
2
3 #foreach( $var in $vars )
4 #if( $var.exec )
5 ${var.varName}=`${var.value}`
6 #else
7 ${var.varName}=${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     case "$ARG" in
123         "--prefix="*)         PREFIX=${D}{ARG#--prefix=} ;;
124         "--exec-prefix="*)    EPREFIX=${D}{ARG#--exec-prefix=} ;;
125         "--bindir="*)         BINDIR=${D}{ARG#----bindir=} ;;
126         "--sbindir="*)        SBINDIR=${D}{ARG#--sbindir=} ;;
127         "--libdir="*)         LIBDIR=${D}{ARG#--libdir=} ;;
128         "--libexecdir="*)     LIBEXECDIR=${D}{ARG#--libexecdir=} ;;
129         "--datadir="*)        DATADIR=${D}{ARG#--datadir=} ;;
130         "--sysconfdir="*)     SYSCONFDIR=${D}{ARG#--sysconfdir=} ;;
131         "--sharedstatedir="*) SHAREDSTATEDIR=${D}{ARG#--sharedstatedir=} ;;
132         "--localstatedir="*)  LOCALSTATEDIR=${D}{ARG#--localstatedir=} ;;
133         "--includedir="*)     INCLUDEDIR=${D}{ARG#--includedir=} ;;
134         "--infodir="*)        INFODIR=${D}{ARG#--infodir=} ;;
135         "--mandir"*)          MANDIR=${D}{ARG#--mandir} ;;
136         "--help"*) printhelp; rm -Rf "$TEMP_DIR"; exit 1 ;;
137     #foreach( $opt in $options )
138         "--${opt.getArgument()}="*) ${opt.getVarName()}=${D}{ARG#--${opt.getArgument()}=} ;;
139     #end
140     #foreach( $feature in $features )
141         "--enable-${feature.arg}") ${feature.getVarName()}=on ;;
142         "--disable-${feature.arg}") unset ${feature.getVarName()} ;;
143     #end
144         "-"*) echo "unknown option: $ARG"; rm -Rf "$TEMP_DIR"; exit 1 ;;
145     esac
146 done
147
148 # set dir variables
149 if [ -z "$BINDIR" ]; then
150     BINDIR=$EPREFIX/bin
151 fi
152 if [ -z "$SBINDIR" ]; then
153     SBINDIR=$EPREFIX/sbin
154 fi
155 if [ -z "$LIBDIR" ]; then
156     LIBDIR=$EPREFIX/lib
157 fi
158 if [ -z "$LIBEXEC" ]; then
159     LIBEXECDIR=$EPREFIX/libexec
160 fi
161 if [ -z "$DATADIR" ]; then
162     DATADIR=$PREFIX/share
163 fi
164 if [ -z "$SYSCONFDIR" ]; then
165     SYSCONFDIR=$PREFIX/etc
166 fi
167 if [ -z "$SHAREDSTATEDIR" ]; then
168     SHAREDSTATEDIR=$PREFIX/com
169 fi
170 if [ -z "$LOCALSTATEDIR" ]; then
171     LOCALSTATEDIR=$PREFIX/var
172 fi
173 if [ -z "$INCLUDEDIR" ]; then
174     INCLUDEDIR=$PREFIX/include
175 fi
176 if [ -z "$INFODIR" ]; then
177     INFODIR=$PREFIX/info
178 fi
179 if [ -z "$MANDIR" ]; then
180     MANDIR=$PREFIX/man
181 fi
182
183 which pkg-config > /dev/null
184 if [ $? -eq 0 ]; then
185     PKG_CONFIG=pkg-config
186 else
187     PKG_CONFIG=false
188 fi
189
190 # Simple uname based platform detection
191 # $PLATFORM is used for platform dependent dependency selection
192 printf "detect platform... "
193 if [ "$OS" = "SunOS" ]; then
194     PLATFORM="solaris sunos unix svr4"
195 fi
196 if [ "$OS" = "Linux" ]; then
197     PLATFORM="linux unix"
198 fi
199 if [ "$OS" = "FreeBSD" ]; then
200     PLATFORM="freebsd bsd unix"
201 fi
202 if [ "$OS" = "Darwin" ]; then
203     PLATFORM="macos osx bsd unix"
204 fi
205 echo "$OS" | grep -i "MINGW" > /dev/null
206 if [ $? -eq 0 ]; then
207     PLATFORM="windows mingw"
208 fi
209
210 if [ -z "$PLATFORM" ]; then
211     PLATFORM="unix"
212 fi
213
214 for p in $PLATFORM
215 do
216     PLATFORM_NAME=$p
217     break
218 done
219 echo $PLATFORM_NAME
220
221 isplatform()
222 {
223     for p in $PLATFORM
224     do
225         if [ "$p" = "$1" ]; then
226             return 0
227         fi
228     done
229     return 1
230 }
231 isnotplatform()
232 {
233     for p in $PLATFORM
234     do
235         if [ "$p" = "$1" ]; then
236             return 1
237         fi
238     done
239     return 0
240 }
241
242 # generate config.mk and config.h
243 cat > "$TEMP_DIR/config.mk" << __EOF__
244 #
245 # config.mk generated by configure
246 #
247
248 # general vars
249 #foreach( $var in $vars )
250 ${var.varName}=$${var.varName}
251 #end
252
253 #if ( ! $project.hasVar("PREFIX") )
254 PREFIX=$PREFIX
255 #end
256 #if ( ! $project.hasVar("EPREFIX") )
257 EPREFIX=$EPREFIX
258 #end
259
260 #if ( ! $project.hasVar("BINDIR") )
261 BINDIR=$BINDIR
262 #end
263 #if ( ! $project.hasVar("SBINDIR") )
264 SBINDIR=$SBINDIR
265 #end
266 #if ( ! $project.hasVar("LIBDIR") )
267 LIBDIR=$LIBDIR
268 #end
269 #if ( ! $project.hasVar("LIBEXECDIR") )
270 LIBEXECDIR=$LIBEXECDIR
271 #end
272 #if ( ! $project.hasVar("DATADIR") )
273 DATADIR=$DATADIR
274 #end
275 #if ( ! $project.hasVar("SYSCONFDIR") )
276 SYSCONFDIR=$SYSCONFDIR
277 #end
278 #if ( ! $project.hasVar("SHAREDSTATEDIR") )
279 SHAREDSTATEDIR=$SHAREDSTATEDIR
280 #end
281 #if ( ! $project.hasVar("LOCALSTATEDIR") )
282 LOCALSTATEDIR=$LOCALSTATEDIR
283 #end
284 #if ( ! $project.hasVar("INCLUDEDIR") )
285 INCLUDEDIR=$INCLUDEDIR
286 #end
287 #if ( ! $project.hasVar("INFODIR") )
288 INFODIR=$INFODIR
289 #end
290 #if ( ! $project.hasVar("MANDIR") )
291 MANDIR=$MANDIR
292 #end
293
294 __EOF__
295
296 echo > "$TEMP_DIR/make.mk"
297
298 ENV_CFLAGS=$CFLAGS
299 ENV_LDFLAGS=$LDFLAGS
300 ENV_CXXFLAGS=$CXXFLAGS
301
302 # Toolchain detection
303 # this will insert make vars to config.mk
304 . make/toolchain.sh
305
306 # add user specified flags to config.mk
307 echo "# project specific flags" >> "$TEMP_DIR/config.mk"
308 if [ -n "${ENV_CFLAGS}" ]; then
309     echo "CFLAGS += $ENV_CFLAGS" >> "$TEMP_DIR/config.mk"
310 fi
311 if [ -n "${ENV_CXXFLAGS}" ]; then
312     echo "CXXFLAGS += $ENV_CXXFLAGS" >> "$TEMP_DIR/config.mk"
313 fi
314 if [ -n "${ENV_LDFLAGS}" ]; then
315     echo "LDFLAGS += $ENV_LDFLAGS" >> "$TEMP_DIR/config.mk"
316 fi
317
318 #
319 # DEPENDENCIES
320 #
321
322 #foreach( $dependency in $namedDependencies )
323 dependency_${dependency.name}()
324 {
325     printf "checking for ${dependency.name}... "
326     #foreach( $sub in $dependency.getSubdependencies() )
327     # dependency $sub.getFullName()
328     while true
329     do
330         #if( $sub.platform )
331         if isnotplatform "${sub.platform}"; then
332             break
333         fi
334         #end
335         #foreach( $not in $sub.getNotList() )
336         if isplatform "${not}"; then
337             break
338         fi
339         #end
340         #if( $sub.pkgconfig.size() > 0 )
341         if [ -z "$PKG_CONFIG" ]; then
342             break
343         fi
344         #end
345         #foreach( $test in $sub.tests )
346         $test > /dev/null
347         if [ $? -ne 0 ]; then
348         break
349         fi
350         #end
351         #foreach( $pkg in $sub.pkgconfig )
352         $pkg.getPkgConfigTestQuery()
353         if [ $? -ne 0 ] ; then
354             break
355         fi
356         TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags $pkg.name`"
357         TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs $pkg.name`"
358         #end
359         #foreach( $flags in $sub.flags )
360         #if( $flags.exec )
361         $flags.value > /dev/null
362         if [ $? -eq 0 ]; then
363             TEMP_$flags.varName="$TEMP_$flags.varName `$flags.value`"
364         else
365             break
366         fi
367         #else
368         TEMP_$flags.varName="$TEMP_$flags.varName $flags.value"
369         #end
370         #end
371         #if ( $sub.make.length() > 0 )
372         cat >> $TEMP_DIR/make.mk << __EOF__
373 # Dependency: $dependency.name
374 $sub.make
375 __EOF__
376         #end
377         echo yes
378         return 0
379     done
380
381     #end
382     echo no
383     return 1
384 }
385 #end
386
387 DEPENDENCIES_FAILED=
388 ERROR=0
389 #if( $dependencies.size() > 0 )
390 # general dependencies
391 TEMP_CFLAGS=
392 TEMP_LDFLAGS=
393 #foreach( $dependency in $dependencies )
394 while true
395 do
396     #if( $dependency.platform )
397     if isnotplatform "${dependency.platform}"; then
398         break
399     fi
400     #end
401     #foreach( $not in $dependency.getNotList() )
402     if isplatform "${not}"; then
403         break
404     fi
405     #end
406     while true
407     do
408         #if( $dependency.pkgconfig.size() > 0 )
409         if [ -z "$PKG_CONFIG" ]; then
410             ERROR=1
411             break
412         fi
413         #end
414         #foreach( $pkg in $dependency.pkgconfig )
415         printf "checking for pkg-config package $pkg.name... "
416         $pkg.getPkgConfigTestQuery()
417         if [ $? -ne 0 ]; then
418             echo no
419             ERROR=1
420             break
421         fi
422         echo yes
423         TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags $pkg.name`"
424         TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs $pkg.name`"
425         #end
426
427         #foreach( $flags in $dependency.flags )
428         #if( $flags.exec )
429         $flags.value > /dev/null
430         if [ $? -ne 0 ]; then
431             TEMP_$flags.varName="$TEMP_$flags.varName `$flags.value`"
432         else
433             ERROR=1
434             break
435         fi
436         #else
437         TEMP_$flags.varName="$TEMP_$flags.varName $flags.value"
438         #end
439         #end
440         #if ( $dependency.make.length() > 0 )
441         cat >> "$TEMP_DIR/make.mk" << __EOF__
442 $dependency.make
443 __EOF__
444         #end
445
446         break
447     done
448
449     break
450 done
451 #end
452
453 # add general dependency flags to config.mk
454 echo >> "$TEMP_DIR/config.mk"
455 if [ -n "${TEMP_CFLAGS}" ]; then
456     echo "CFLAGS += $TEMP_CFLAGS" >> $TEMP_DIR/config.mk
457 fi
458 if [ -n "${TEMP_CXXFLAGS}" ]; then
459     echo "CXXFLAGS += $TEMP_CXXFLAGS" >> $TEMP_DIR/config.mk
460 fi
461 if [ -n "${TEMP_LDFLAGS}" ]; then
462     echo "LDFLAGS += $TEMP_LDFLAGS" >> $TEMP_DIR/config.mk
463 fi
464 #end
465
466 #
467 # OPTION VALUES
468 #
469 #foreach( $opt in $options )
470 #foreach( $val in $opt.values )
471 ${val.func}()
472 {
473     VERR=0
474     #foreach( $dep in $val.dependencies )
475     dependency_$dep
476     if [ $? -ne 0 ]; then
477         VERR=1
478     fi
479     #end
480     if [ $VERR -ne 0 ]; then
481         return 1
482     fi
483     #foreach( $def in $val.defines )
484         TEMP_CFLAGS="$TEMP_CFLAGS ${def.toFlags()}"
485     #end
486     #if( $val.hasMake() )
487     cat >> "$TEMP_DIR/make.mk" << __EOF__
488 $val.make
489 __EOF__
490     #end
491     return 0
492 }
493 #end
494 #end
495
496 #
497 # TARGETS
498 #
499 TEMP_CFLAGS=
500 TEMP_CXXFLAGS=
501 TEMP_LDFLAGS=
502
503 #foreach( $target in $targets )
504 #if ( $target.name )
505 # Target: $target.name
506 #else
507 # Target
508 #end
509 TEMP_CFLAGS=
510 TEMP_LDFLAGS=
511 TEMP_CXXFLAGS=
512
513 #foreach( $dependency in $target.dependencies )
514 dependency_$dependency
515 if [ $? -ne 0 ]; then
516     DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} "
517     ERROR=1
518 fi
519 #end
520
521 # Features
522 #foreach( $feature in $target.features )
523 if [ -n "$${feature.getVarName()}" ]; then
524 #foreach( $dependency in $feature.dependencies )
525     # check dependency
526     dependency_$dependency
527     if [ $? -ne 0 ]; then
528         # "auto" features can fail and are just disabled in this case
529         if [ "$${feature.getVarName()}" != "auto" ]; then
530             DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} "
531             ERROR=1
532         fi
533     fi
534 #end
535 fi
536 #end
537
538 #foreach( $opt in $target.options )
539 # Option: --${opt.argument}
540 if [ -z ${D}${opt.getVarName()} ]; then
541     SAVED_ERROR="$ERROR"
542     SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED"
543     ERROR=0
544     while true
545     do
546         #foreach( $optdef in $opt.defaults )
547         #if( $optdef.platform )
548         if isplatform "$optdef.platform"; then
549         #end
550         $optdef.func
551         if [ $? -eq 0 ]; then
552             echo "  ${opt.argument}: ${optdef.valueName}" >> "$TEMP_DIR/options"
553             ERROR=0
554             break
555         fi
556         #if( $optdef.platform )
557         fi
558         #end
559         #end
560         break
561     done
562     if [ $ERROR -ne 0 ]; then
563         SAVED_ERROR=1
564     fi
565     ERROR="$SAVED_ERROR"
566     DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED"
567 else
568     if false; then
569         false
570     #foreach( $optval in $opt.values )
571     elif [ "${D}${opt.getVarName()}" = "${optval.value}" ]; then
572         echo "  ${opt.argument}: ${D}${opt.getVarName()}" >> $TEMP_DIR/options
573         $optval.func
574         if [ $? -ne 0 ]; then
575             ERROR=1
576         fi
577     #end
578     fi
579 fi
580 #end
581
582 echo >> "$TEMP_DIR/config.mk"
583 if [ -n "${TEMP_CFLAGS}" ]; then
584     echo "${target.getCFlags()}  += $TEMP_CFLAGS" >> "$TEMP_DIR/config.mk"
585 fi
586 if [ -n "${TEMP_CXXFLAGS}" ]; then
587     echo "${target.getCXXFlags()} += $TEMP_CXXFLAGS" >> "$TEMP_DIR/config.mk"
588 fi
589 if [ -n "${TEMP_LDFLAGS}" ]; then
590     echo "${target.getLDFlags()} += $TEMP_LDFLAGS" >> "$TEMP_DIR/config.mk"
591 fi
592
593 #end
594 if [ $ERROR -ne 0 ]; then
595     echo
596     echo "Error: Unresolved dependencies"
597     echo "$DEPENDENCIES_FAILED"
598     rm -Rf "$TEMP_DIR"
599     exit 1
600 fi
601
602 echo "configure finished"
603 echo
604 echo "Build Config:"
605 echo "  PREFIX:    $PREFIX"
606 echo "  TOOLCHAIN: $TOOLCHAIN_NAME"
607 #if ( $options.size() > 0 )
608 echo "Options:"
609 cat "$TEMP_DIR/options"
610 #end
611 echo
612 cat "$TEMP_DIR/config.mk" "$TEMP_DIR/make.mk" > config.mk
613 rm -Rf "$TEMP_DIR"
614
615