1 #!/bin/sh
2
3
4 # some utility functions
5 isplatform()
6 {
7 for p in $PLATFORM
8 do
9 if [ "$p" = "$1" ]; then
10 return 0
11 fi
12 done
13 return 1
14 }
15 notisplatform()
16 {
17 for p in $PLATFORM
18 do
19 if [ "$p" = "$1" ]; then
20 return 1
21 fi
22 done
23 return 0
24 }
25 istoolchain()
26 {
27 for t in $TOOLCHAIN
28 do
29 if [ "$t" = "$1" ]; then
30 return 0
31 fi
32 done
33 return 1
34 }
35 notistoolchain()
36 {
37 for t in $TOOLCHAIN
38 do
39 if [ "$t" = "$1" ]; then
40 return 1
41 fi
42 done
43 return 0
44 }
45
46 # clean abort
47 abort_configure()
48 {
49 rm -Rf "$TEMP_DIR"
50 exit 1
51 }
52
53 # Test for availability of pkg-config
54 PKG_CONFIG=`command -v pkg-config`
55 : ${PKG_CONFIG:="false"}
56
57 # Simple uname based platform detection
58 # $PLATFORM is used for platform dependent dependency selection
59 OS=`uname -s`
60 OS_VERSION=`uname -r`
61 ARCH=`uname -m`
62 printf "detect platform... "
63 if [ "$OS" = "SunOS" ]; then
64 PLATFORM="solaris sunos unix svr4"
65 elif [ "$OS" = "Linux" ]; then
66 PLATFORM="linux unix"
67 elif [ "$OS" = "FreeBSD" ]; then
68 PLATFORM="freebsd bsd unix"
69 elif [ "$OS" = "OpenBSD" ]; then
70 PLATFORM="openbsd bsd unix"
71 elif [ "$OS" = "NetBSD" ]; then
72 PLATFORM="netbsd bsd unix"
73 elif [ "$OS" = "Darwin" ]; then
74 PLATFORM="macos osx bsd unix"
75 elif echo "$OS" | grep -i "MINGW" > /dev/null; then
76 PLATFORM="windows mingw"
77 fi
78 : ${PLATFORM:="unix"}
79
80 PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -`
81 echo "$PLATFORM_NAME"
82
83
84 # help text
85 printhelp()
86 {
87 echo "Usage: $0 [OPTIONS]..."
88 echo 'Configuration:'
89 if true \
90 ; then
91 :
92 if test -z "$prefix__described__"; then
93 prefix__described__=1
94 cat << '__EOF__'
95 --prefix path prefix for architecture-independent files
96 [`pwd`/work]
97 __EOF__
98 fi
99 if test -z "$exec_prefix__described__"; then
100 exec_prefix__described__=1
101 cat << '__EOF__'
102 --exec-prefix path prefix for architecture-dependent files [PREFIX]
103 __EOF__
104 fi
105 fi
106 cat << '__EOF__'
107
108 Build Types:
109 --debug add extra compile flags for debug builds
110 --release add extra compile flags for release builds
111
112 Optional Features:
113 --enable-postgresql
114
115 __EOF__
116 abort_configure
117 }
118
119 # create temporary directory
120 TEMP_DIR=".tmp-`uname -n`"
121 rm -Rf "$TEMP_DIR"
122 if mkdir -p "$TEMP_DIR"; then
123 :
124 else
125 echo "Cannot create tmp dir $TEMP_DIR"
126 echo "Abort"
127 exit 1
128 fi
129 touch "$TEMP_DIR/options"
130 touch "$TEMP_DIR/features"
131
132 # config variables
133 if true \
134 ; then
135 :
136 if test -z "$host__initialized__"; then
137 host__initialized__=1
138 host=`uname -n`
139 fi
140 if test -z "$prefix__initialized__"; then
141 prefix__initialized__=1
142 prefix='`pwd`/work'
143 fi
144 if test -z "$exec_prefix__initialized__"; then
145 exec_prefix__initialized__=1
146 exec_prefix=''
147 fi
148 fi
149
150 # features
151
152 #
153 # parse arguments
154 #
155 BUILD_TYPE="default"
156 for ARG in "$@"
157 do
158 case "$ARG" in
159 "--prefix="*) prefix=${ARG#--prefix=} ;;
160 "--exec-prefix="*) exec_prefix=${ARG#--exec-prefix=} ;;
161 "--help"*) printhelp ;;
162 "--debug") BUILD_TYPE="debug" ;;
163 "--release") BUILD_TYPE="release" ;;
164 "--enable-postgresql") FEATURE_POSTGRESQL=on ;;
165 "--disable-postgresql") unset FEATURE_POSTGRESQL ;;
166 "-"*) echo "unknown option: $ARG"; abort_configure ;;
167 esac
168 done
169
170 # toolchain detection utilities
171 . make/toolchain.sh
172
173 # check languages
174 lang_c=
175 lang_cpp=
176 if detect_c_compiler ; then
177 lang_c=1
178 fi
179
180
181
182 # set defaults for dir variables
183 : ${exec_prefix:="$prefix"}
184 : ${bindir:='${exec_prefix}/bin'}
185 : ${sbindir:='${exec_prefix}/sbin'}
186 : ${libdir:='${exec_prefix}/lib'}
187 : ${libexecdir:='${exec_prefix}/libexec'}
188 : ${datarootdir:='${prefix}/share'}
189 : ${datadir:='${datarootdir}'}
190 : ${sharedstatedir:='${prefix}/com'}
191 if [ -z "$sysconfdir" ]; then
192 if [ "$prefix" = '/usr' ]; then
193 sysconfdir='/etc'
194 else
195 sysconfdir='${prefix}/etc'
196 fi
197 fi
198 if [ -z "$localstatedir" ]; then
199 if [ "$prefix" = '/usr' ]; then
200 localstatedir='/var'
201 else
202 localstatedir='${prefix}/var'
203 fi
204 fi
205 if [ -z "$runstatedir" ]; then
206 if [ "$prefix" = '/usr' ]; then
207 runstatedir='/var/run'
208 else
209 runstatedir='${prefix}/var'
210 fi
211 fi
212 : ${includedir:='${prefix}/include'}
213 : ${infodir:='${datarootdir}/info'}
214 : ${mandir:='${datarootdir}/man'}
215 : ${localedir:='${datarootdir}/locale'}
216
217
218 # check if a config.site exists and load it
219 CONFIG_SITE_OK=0
220 if [ -n "$CONFIG_SITE" ]; then
221 # CONFIG_SITE may contain space separated file names
222 for cs in $CONFIG_SITE; do
223 printf "loading defaults from $cs... "
224 if [ -f "$cs" ]; then
225 . "$cs"
226 echo ok
227 CONFIG_SITE_OK=1
228 break
229 else
230 echo "not found"
231 fi
232 done
233 elif [ -f "$prefix/share/config.site" ]; then
234 printf "loading site defaults... "
235 . "$prefix/share/config.site"
236 echo ok
237 CONFIG_SITE_OK=1
238 elif [ -f "$prefix/etc/config.site" ]; then
239 printf "loading site defaults... "
240 . "$prefix/etc/config.site"
241 echo ok
242 CONFIG_SITE_OK=1
243 fi
244
245 if [ $CONFIG_SITE_OK -eq 0 ]; then
246 # try to detect the correct libdir on our own, except it was changed by the user
247 if [ "$libdir" = '${exec_prefix}/lib' ] ; then
248 if [ "$TOOLCHAIN_WSIZE" = "64" ] ; then
249 if [ "$OS" = "SunOS" ]; then
250 [ -d "${exec_prefix}/lib/64" ] && libdir='${exec_prefix}/lib/64'
251 else
252 [ -d "${exec_prefix}/lib64" ] && libdir='${exec_prefix}/lib64'
253 fi
254 elif [ "$TOOLCHAIN_WSIZE" = "32" ] ; then
255 if [ "$OS" = "SunOS" ]; then
256 [ -d "${exec_prefix}/lib/32" ] && libdir='${exec_prefix}/lib/32'
257 else
258 [ -d "${exec_prefix}/lib32" ] && libdir='${exec_prefix}/lib32'
259 fi
260 fi
261 fi
262 fi
263
264
265 # generate vars.mk
266 cat > "$TEMP_DIR/vars.mk" << __EOF__
267 host=$host
268 prefix=$prefix
269 exec_prefix=$exec_prefix
270 __EOF__
271
272
273 #
274 # DEPENDENCIES
275 #
276
277
278
279 # create buffer for make variables required by dependencies
280 echo > "$TEMP_DIR/make.mk"
281
282 test_pkg_config()
283 {
284 if "$PKG_CONFIG" --exists "$1" ; then :
285 else return 1 ; fi
286 if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
287 else return 1 ; fi
288 if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
289 else return 1 ; fi
290 if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
291 else return 1 ; fi
292 return 0
293 }
294
295 print_check_msg()
296 {
297 if [ -z "$1" ]; then
298 shift
299 printf "$@"
300 fi
301 }
302
303 dependency_error_libpq()
304 {
305 print_check_msg "$dep_checked_libpq" "checking for libpq... "
306 # dependency libpq
307 while true
308 do
309 if [ -z "$PKG_CONFIG" ]; then
310 break
311 fi
312 if test_pkg_config "libpq" "" "" "" ; then
313 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags libpq`"
314 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs libpq`"
315 else
316 break
317 fi
318 cat >> $TEMP_DIR/make.mk << __EOF__
319 # Dependency: libpq
320 CFLAGS += -DENABLE_POSTGRESQL
321 PLUGINS += postgresql
322 TEST_PLUGIN_LDFLAGS += -lwspgtest
323 __EOF__
324 print_check_msg "$dep_checked_libpq" "yes\n"
325 dep_checked_libpq=1
326 return 1
327 done
328
329 print_check_msg "$dep_checked_libpq" "no\n"
330 dep_checked_libpq=1
331 return 0
332 }
333 dependency_error_openssl()
334 {
335 print_check_msg "$dep_checked_openssl" "checking for openssl... "
336 # dependency openssl
337 while true
338 do
339 if [ -z "$PKG_CONFIG" ]; then
340 break
341 fi
342 if test_pkg_config "openssl" "" "" "" ; then
343 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags openssl`"
344 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs openssl`"
345 else
346 break
347 fi
348 print_check_msg "$dep_checked_openssl" "yes\n"
349 dep_checked_openssl=1
350 return 1
351 done
352
353 # dependency openssl
354 while true
355 do
356 TEMP_LDFLAGS="$TEMP_LDFLAGS -lssl -lcrypto"
357 print_check_msg "$dep_checked_openssl" "yes\n"
358 dep_checked_openssl=1
359 return 1
360 done
361
362 print_check_msg "$dep_checked_openssl" "no\n"
363 dep_checked_openssl=1
364 return 0
365 }
366 dependency_error_libxml2()
367 {
368 print_check_msg "$dep_checked_libxml2" "checking for libxml2... "
369 # dependency libxml2
370 while true
371 do
372 if [ -z "$PKG_CONFIG" ]; then
373 break
374 fi
375 if test_pkg_config "libxml-2.0" "" "" "" ; then
376 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags libxml-2.0`"
377 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs libxml-2.0`"
378 else
379 break
380 fi
381 print_check_msg "$dep_checked_libxml2" "yes\n"
382 dep_checked_libxml2=1
383 return 1
384 done
385
386 # dependency libxml2
387 while true
388 do
389 if tmp_flags=`xml2-config --cflags` ; then
390 TEMP_CFLAGS="$TEMP_CFLAGS $tmp_flags"
391 else
392 break
393 fi
394 if tmp_flags=`xml2-config --libs` ; then
395 TEMP_LDFLAGS="$TEMP_LDFLAGS $tmp_flags"
396 else
397 break
398 fi
399 print_check_msg "$dep_checked_libxml2" "yes\n"
400 dep_checked_libxml2=1
401 return 1
402 done
403
404 print_check_msg "$dep_checked_libxml2" "no\n"
405 dep_checked_libxml2=1
406 return 0
407 }
408
409 # start collecting dependency information
410 echo > "$TEMP_DIR/flags.mk"
411
412 DEPENDENCIES_FAILED=
413 ERROR=0
414 # unnamed dependencies
415 TEMP_CFLAGS="$CFLAGS"
416 TEMP_CXXFLAGS="$CXXFLAGS"
417 TEMP_LDFLAGS="$LDFLAGS"
418 while true
419 do
420 while true
421 do
422 if [ -z "$lang_c" ] ; then
423 ERROR=1
424 break
425 fi
426
427 break
428 done
429 break
430 done
431 while true
432 do
433 if notisplatform "linux"; then
434 break
435 fi
436 while true
437 do
438
439 TEMP_CFLAGS="$TEMP_CFLAGS -DLINUX"
440 TEMP_LDFLAGS="$TEMP_LDFLAGS -lpthread -ldl -lm -lldap -llber"
441 cat >> "$TEMP_DIR/make.mk" << __EOF__
442 # platform dependend source files
443 PLATFORM_DAEMONOBJ = event_linux.o
444
445 # platform dependend vars
446 OBJ_EXT = .o
447 LIB_EXT = .so
448 APP_EXT =
449
450 # ld flags
451 UCX_SO_NAME =
452 RPATH_WS_LIB_FLAG = -Wl,-rpath,'\$\$ORIGIN/../lib'
453 __EOF__
454 break
455 done
456 break
457 done
458 while true
459 do
460 if notisplatform "bsd"; then
461 break
462 fi
463 if isplatform "macos" || istoolchain "macos"; then
464 break
465 fi
466 while true
467 do
468
469 TEMP_CFLAGS="$TEMP_CFLAGS -DBSD -I/usr/local/include"
470 TEMP_LDFLAGS="$TEMP_LDFLAGS -lpthread -lm -lldap -llber"
471 cat >> "$TEMP_DIR/make.mk" << __EOF__
472 # platform dependend source files
473 PLATFORM_DAEMONOBJ = event_bsd.o
474
475 # platform dependend vars
476 OBJ_EXT = .o
477 LIB_EXT = .so
478 APP_EXT =
479
480 # ld flags
481 UCX_SO_NAME =
482 RPATH_WS_LIB_FLAG = -Wl,-rpath,'\$\$ORIGIN/../lib'
483 __EOF__
484 break
485 done
486 break
487 done
488 while true
489 do
490 if notisplatform "macos"; then
491 break
492 fi
493 while true
494 do
495
496 TEMP_CFLAGS="$TEMP_CFLAGS -DBSD -DOSX"
497 TEMP_LDFLAGS="$TEMP_LDFLAGS -lpthread -ldl -lm -lldap -llber"
498 cat >> "$TEMP_DIR/make.mk" << __EOF__
499 # platform dependend source files
500 PLATFORM_DAEMONOBJ = event_bsd.o
501
502 # platform dependend vars
503 OBJ_EXT = .o
504 LIB_EXT = .dylib
505 APP_EXT =
506
507 # ld flags
508 SHLIB_LDFLAGS = -dynamiclib
509 UCX_SO_NAME = -install_name @rpath/libucx.dylib
510 RPATH_WS_LIB_FLAG = -rpath @loader_path/../lib
511 __EOF__
512 break
513 done
514 break
515 done
516 while true
517 do
518 if notisplatform "solaris"; then
519 break
520 fi
521 while true
522 do
523
524 TEMP_CFLAGS="$TEMP_CFLAGS -DSOLARIS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS"
525 TEMP_LDFLAGS="$TEMP_LDFLAGS -lsocket -lnsl -lsendfile -lposix4 -lpthread -ldl -lm -lmd -lldap"
526 cat >> "$TEMP_DIR/make.mk" << __EOF__
527 # platform dependend source files
528 PLATFORM_DAEMONOBJ = event_solaris.o
529
530 # platform dependend vars
531 OBJ_EXT = .o
532 LIB_EXT = .so
533 APP_EXT =
534 __EOF__
535 break
536 done
537 break
538 done
539 while true
540 do
541 while true
542 do
543
544 cat >> "$TEMP_DIR/make.mk" << __EOF__
545 HOST = $host
546 INSTALL_DIR = $prefix
547 __EOF__
548 break
549 done
550 break
551 done
552
553 # build type
554 if [ "$BUILD_TYPE" = "debug" ]; then
555 TEMP_CFLAGS="\${DEBUG_CFLAGS} $TEMP_CFLAGS"
556 TEMP_CXXFLAGS="\${DEBUG_CXXFLAGS} $TEMP_CXXFLAGS"
557 fi
558 if [ "$BUILD_TYPE" = "release" ]; then
559 TEMP_CFLAGS="\${RELEASE_CFLAGS} $TEMP_CFLAGS"
560 TEMP_CXXFLAGS="\${RELEASE_CXXFLAGS} $TEMP_CXXFLAGS"
561 fi
562
563 # add general dependency flags to flags.mk
564 echo "# general flags" >> "$TEMP_DIR/flags.mk"
565 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
566 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
567 fi
568 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
569 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
570 fi
571 if [ -n "${TEMP_LDFLAGS}" ]; then
572 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
573 fi
574
575 #
576 # OPTION VALUES
577 #
578
579 #
580 # TARGETS
581 #
582
583 echo >> "$TEMP_DIR/flags.mk"
584 echo "configuring global target"
585 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
586 TEMP_CFLAGS=
587 TEMP_CXXFLAGS=
588 TEMP_LDFLAGS=
589
590 if dependency_error_libxml2; then
591 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED libxml2 "
592 ERROR=1
593 fi
594 if dependency_error_openssl; then
595 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED openssl "
596 ERROR=1
597 fi
598
599 # Features
600
601
602 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
603 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
604 fi
605 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
606 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
607 fi
608 if [ -n "${TEMP_LDFLAGS}" ]; then
609 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
610 fi
611
612 echo >> "$TEMP_DIR/flags.mk"
613 echo "configuring target: postgresql"
614 echo "# flags for target postgresql" >> "$TEMP_DIR/flags.mk"
615 TEMP_CFLAGS=
616 TEMP_CXXFLAGS=
617 TEMP_LDFLAGS=
618
619
620 # Features
621 if [ -n "$FEATURE_POSTGRESQL" ]; then
622 # check dependency
623 if dependency_error_libpq ; then
624 # "auto" features can fail and are just disabled in this case
625 if [ "$FEATURE_POSTGRESQL" = "auto" ]; then
626 DISABLE_FEATURE_POSTGRESQL=1
627 else
628 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED libpq "
629 ERROR=1
630 fi
631 fi
632 if [ -n "$DISABLE_FEATURE_POSTGRESQL" ]; then
633 unset FEATURE_POSTGRESQL
634 fi
635 fi
636 if [ -n "$FEATURE_POSTGRESQL" ]; then
637 :
638 else
639 :
640 fi
641
642
643 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
644 echo "POSTGRESQL_CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
645 fi
646 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
647 echo "POSTGRESQL_CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
648 fi
649 if [ -n "${TEMP_LDFLAGS}" ]; then
650 echo "POSTGRESQL_LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
651 fi
652
653
654 # final result
655 if [ $ERROR -ne 0 ]; then
656 echo
657 echo "Error: Unresolved dependencies"
658 echo "$DEPENDENCIES_FAILED"
659 abort_configure
660 fi
661
662 echo "configure finished"
663 echo
664 echo "Toolchain:"
665 echo " name: $TOOLCHAIN_NAME"
666 if [ -n "$TOOLCHAIN_CC" ]; then
667 echo " cc: $TOOLCHAIN_CC"
668 fi
669 if [ -n "$TOOLCHAIN_CXX" ]; then
670 echo " cxx: $TOOLCHAIN_CXX"
671 fi
672 if [ -n "$TOOLCHAIN_WSIZE" ]; then
673 echo " word size: $TOOLCHAIN_WSIZE bit"
674 fi
675 if [ -n "$TOOLCHAIN_CSTD" ]; then
676 echo " default C std: $TOOLCHAIN_CSTD"
677 fi
678 echo
679 echo "Config:"
680 printf ' %-16s' 'prefix:'
681 echo "$prefix"
682 printf ' %-16s' 'exec-prefix:'
683 echo "$exec_prefix"
684 echo
685 echo "Features:"
686 printf ' %-16s' 'postgresql:'
687 if [ -n "$FEATURE_POSTGRESQL" ]; then
688 echo 'on'
689 else
690 echo 'off'
691 fi
692 echo
693
694 # generate the config.mk file
695 pwd=`pwd`
696 cat > "$TEMP_DIR/config.mk" << __EOF__
697 #
698 # config.mk generated by:
699 # pwd: $pwd
700 # $0 $@
701 #
702
703 __EOF__
704 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
705 cat "$TEMP_DIR/config.mk" "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
706 rm -Rf "$TEMP_DIR"
707