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