|
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 |