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 [/usr]
96 __EOF__
97 fi
98 if test -z "$exec_prefix__described__"; then
99 exec_prefix__described__=1
100 cat << '__EOF__'
101 --exec-prefix path prefix for architecture-dependent files [PREFIX]
102 __EOF__
103 fi
104 if test -z "$libdir__described__"; then
105 libdir__described__=1
106 cat << '__EOF__'
107 --libdir object code libraries [EPREFIX/lib]
108 __EOF__
109 fi
110 if test -z "$includedir__described__"; then
111 includedir__described__=1
112 cat << '__EOF__'
113 --includedir C header files [PREFIX/include]
114 __EOF__
115 fi
116 fi
117 if true \
118 && isplatform "freebsd" \
119 ; then
120 :
121 if test -z "$pkgconfigdir__described__"; then
122 pkgconfigdir__described__=1
123 cat << '__EOF__'
124 --pkgconfigdir location of the *.pc files
125 __EOF__
126 fi
127 fi
128 if true \
129 && notisplatform "freebsd" \
130 ; then
131 :
132 if test -z "$pkgconfigdir__described__"; then
133 pkgconfigdir__described__=1
134 cat << '__EOF__'
135 --pkgconfigdir location of the *.pc files
136 __EOF__
137 fi
138 fi
139 if true \
140 ; then
141 :
142 if test -z "$DOXYGEN__described__"; then
143 DOXYGEN__described__=1
144 cat << '__EOF__'
145 --doxygen path of the Doxygen executable
146 __EOF__
147 fi
148 fi
149 cat << '__EOF__'
150
151 Build Types:
152 --debug add extra compile flags for debug builds
153 --release add extra compile flags for release builds
154
155 Optional Features:
156 --enable-api-docs run Doxygen during build
157 --enable-coverage test coverage with gcov
158 --enable-asan address sanitizer
159 --enable-ubsan undefined behavior sanitizer
160 --disable-cxx-tests the check-cxx makefile target
161 --disable-szmul-builtin use custom implementation, instead
162 --disable-memrchr
163 --disable-mkstemp
164 --disable-qsort_r
165
166 __EOF__
167 abort_configure
168 }
169
170 # create temporary directory
171 TEMP_DIR=".tmp-`uname -n`"
172 rm -Rf "$TEMP_DIR"
173 if mkdir -p "$TEMP_DIR"; then
174 :
175 else
176 echo "Cannot create tmp dir $TEMP_DIR"
177 echo "Abort"
178 exit 1
179 fi
180 touch "$TEMP_DIR/options"
181 touch "$TEMP_DIR/features"
182
183 # config variables
184 if true \
185 ; then
186 :
187 if test -z "$prefix__initialized__"; then
188 prefix__initialized__=1
189 prefix='/usr'
190 fi
191 if test -z "$exec_prefix__initialized__"; then
192 exec_prefix__initialized__=1
193 exec_prefix=''
194 fi
195 if test -z "$libdir__initialized__"; then
196 libdir__initialized__=1
197 libdir=''
198 fi
199 if test -z "$includedir__initialized__"; then
200 includedir__initialized__=1
201 includedir=''
202 fi
203 if test -z "$VERSION__initialized__"; then
204 VERSION__initialized__=1
205 VERSION='4.0.0'
206 fi
207 if test -z "$LIBVERSION__initialized__"; then
208 LIBVERSION__initialized__=1
209 LIBVERSION='7.0.0'
210 fi
211 if test -z "$LIBVERSION_MAJOR__initialized__"; then
212 LIBVERSION_MAJOR__initialized__=1
213 LIBVERSION_MAJOR='7'
214 fi
215 if test -z "$root_dir__initialized__"; then
216 root_dir__initialized__=1
217 root_dir=`pwd`
218 fi
219 if test -z "$build_dir__initialized__"; then
220 build_dir__initialized__=1
221 build_dir='${root_dir}/build'
222 fi
223 if test -z "$docs_dir__initialized__"; then
224 docs_dir__initialized__=1
225 docs_dir='${root_dir}/build/docs'
226 fi
227 if test -z "$dist_dir__initialized__"; then
228 dist_dir__initialized__=1
229 dist_dir='${root_dir}/dist'
230 fi
231 if test -z "$MKDIR__initialized__"; then
232 MKDIR__initialized__=1
233 MKDIR='/bin/mkdir -p'
234 fi
235 if test -z "$RMFILE__initialized__"; then
236 RMFILE__initialized__=1
237 RMFILE='/bin/rm -f'
238 fi
239 if test -z "$RMDIR__initialized__"; then
240 RMDIR__initialized__=1
241 RMDIR='/bin/rm -f -R'
242 fi
243 if test -z "$COPYFILE__initialized__"; then
244 COPYFILE__initialized__=1
245 COPYFILE='/bin/cp -f'
246 fi
247 if test -z "$COPYALL__initialized__"; then
248 COPYALL__initialized__=1
249 COPYALL='/bin/cp -f -R'
250 fi
251 if test -z "$SYMLINK__initialized__"; then
252 SYMLINK__initialized__=1
253 SYMLINK='/bin/ln -s'
254 fi
255 fi
256 if true \
257 && isplatform "freebsd" \
258 ; then
259 :
260 if test -z "$pkgconfigdir__initialized__"; then
261 pkgconfigdir__initialized__=1
262 pkgconfigdir='${exec_prefix}/libdata/pkgconfig'
263 fi
264 fi
265 if true \
266 && notisplatform "freebsd" \
267 ; then
268 :
269 if test -z "$pkgconfigdir__initialized__"; then
270 pkgconfigdir__initialized__=1
271 pkgconfigdir='${libdir}/pkgconfig'
272 fi
273 fi
274 if true \
275 ; then
276 :
277 if test -z "$DOXYGEN__initialized__"; then
278 DOXYGEN__initialized__=1
279 DOXYGEN=`command -v doxygen || echo '/bin/false'`
280 fi
281 fi
282
283 # features
284 FEATURE_CXX_TESTS=auto
285 FEATURE_SZMUL_BUILTIN=auto
286 FEATURE_MEMRCHR=auto
287 FEATURE_MKSTEMP=auto
288 FEATURE_QSORT_R=auto
289
290 #
291 # parse arguments
292 #
293 BUILD_TYPE="default"
294 for ARG in "$@"
295 do
296 case "$ARG" in
297 "--prefix="*) prefix=${ARG#--prefix=} ;;
298 "--exec-prefix="*) exec_prefix=${ARG#--exec-prefix=} ;;
299 "--libdir="*) libdir=${ARG#--libdir=} ;;
300 "--includedir="*) includedir=${ARG#--includedir=} ;;
301 "--pkgconfigdir="*) pkgconfigdir=${ARG#--pkgconfigdir=} ;;
302 "--doxygen="*) DOXYGEN=${ARG#--doxygen=} ;;
303 "--help"*) printhelp ;;
304 "--debug") BUILD_TYPE="debug" ;;
305 "--release") BUILD_TYPE="release" ;;
306 "--enable-api-docs") FEATURE_API_DOCS=on ;;
307 "--disable-api-docs") unset FEATURE_API_DOCS ;;
308 "--enable-coverage") FEATURE_COVERAGE=on ;;
309 "--disable-coverage") unset FEATURE_COVERAGE ;;
310 "--enable-asan") FEATURE_ASAN=on ;;
311 "--disable-asan") unset FEATURE_ASAN ;;
312 "--enable-ubsan") FEATURE_UBSAN=on ;;
313 "--disable-ubsan") unset FEATURE_UBSAN ;;
314 "--enable-cxx-tests") FEATURE_CXX_TESTS=on ;;
315 "--disable-cxx-tests") unset FEATURE_CXX_TESTS ;;
316 "--enable-szmul-builtin") FEATURE_SZMUL_BUILTIN=on ;;
317 "--disable-szmul-builtin") unset FEATURE_SZMUL_BUILTIN ;;
318 "--enable-memrchr") FEATURE_MEMRCHR=on ;;
319 "--disable-memrchr") unset FEATURE_MEMRCHR ;;
320 "--enable-mkstemp") FEATURE_MKSTEMP=on ;;
321 "--disable-mkstemp") unset FEATURE_MKSTEMP ;;
322 "--enable-qsort_r") FEATURE_QSORT_R=on ;;
323 "--disable-qsort_r") unset FEATURE_QSORT_R ;;
324 "-"*) echo "unknown option: $ARG"; abort_configure ;;
325 esac
326 done
327
328 # toolchain detection utilities
329 . make/toolchain.sh
330
331 # check languages
332 lang_c=
333 lang_cpp=
334 if detect_cpp_compiler ; then
335 lang_cpp=1
336 fi
337 if detect_c_compiler ; then
338 lang_c=1
339 fi
340
341
342
343 # set defaults for dir variables
344 : ${exec_prefix:="$prefix"}
345 : ${bindir:='${exec_prefix}/bin'}
346 : ${sbindir:='${exec_prefix}/sbin'}
347 : ${libdir:='${exec_prefix}/lib'}
348 : ${libexecdir:='${exec_prefix}/libexec'}
349 : ${datarootdir:='${prefix}/share'}
350 : ${datadir:='${datarootdir}'}
351 : ${sharedstatedir:='${prefix}/com'}
352 if [ -z "$sysconfdir" ]; then
353 if [ "$prefix" = '/usr' ]; then
354 sysconfdir='/etc'
355 else
356 sysconfdir='${prefix}/etc'
357 fi
358 fi
359 if [ -z "$localstatedir" ]; then
360 if [ "$prefix" = '/usr' ]; then
361 localstatedir='/var'
362 else
363 localstatedir='${prefix}/var'
364 fi
365 fi
366 if [ -z "$runstatedir" ]; then
367 if [ "$prefix" = '/usr' ]; then
368 runstatedir='/var/run'
369 else
370 runstatedir='${prefix}/var'
371 fi
372 fi
373 : ${includedir:='${prefix}/include'}
374 : ${infodir:='${datarootdir}/info'}
375 : ${mandir:='${datarootdir}/man'}
376 : ${localedir:='${datarootdir}/locale'}
377
378
379 # check if a config.site exists and load it
380 CONFIG_SITE_OK=0
381 if [ -n "$CONFIG_SITE" ]; then
382 # CONFIG_SITE may contain space separated file names
383 for cs in $CONFIG_SITE; do
384 printf "loading defaults from $cs... "
385 if [ -f "$cs" ]; then
386 . "$cs"
387 echo ok
388 CONFIG_SITE_OK=1
389 break
390 else
391 echo "not found"
392 fi
393 done
394 elif [ -f "$prefix/share/config.site" ]; then
395 printf "loading site defaults... "
396 . "$prefix/share/config.site"
397 echo ok
398 CONFIG_SITE_OK=1
399 elif [ -f "$prefix/etc/config.site" ]; then
400 printf "loading site defaults... "
401 . "$prefix/etc/config.site"
402 echo ok
403 CONFIG_SITE_OK=1
404 fi
405
406 if [ $CONFIG_SITE_OK -eq 0 ]; then
407 # try to detect the correct libdir on our own, except it was changed by the user
408 if [ "$libdir" = '${exec_prefix}/lib' ] ; then
409 if [ "$TOOLCHAIN_WSIZE" = "64" ] ; then
410 if [ "$OS" = "SunOS" ]; then
411 [ -d "${exec_prefix}/lib/64" ] && libdir='${exec_prefix}/lib/64'
412 else
413 [ -d "${exec_prefix}/lib64" ] && libdir='${exec_prefix}/lib64'
414 fi
415 elif [ "$TOOLCHAIN_WSIZE" = "32" ] ; then
416 if [ "$OS" = "SunOS" ]; then
417 [ -d "${exec_prefix}/lib/32" ] && libdir='${exec_prefix}/lib/32'
418 else
419 [ -d "${exec_prefix}/lib32" ] && libdir='${exec_prefix}/lib32'
420 fi
421 fi
422 fi
423 fi
424
425
426 # generate vars.mk
427 cat > "$TEMP_DIR/vars.mk" << __EOF__
428 prefix=$prefix
429 exec_prefix=$exec_prefix
430 libdir=$libdir
431 includedir=$includedir
432 VERSION=$VERSION
433 LIBVERSION=$LIBVERSION
434 LIBVERSION_MAJOR=$LIBVERSION_MAJOR
435 root_dir=$root_dir
436 build_dir=$build_dir
437 docs_dir=$docs_dir
438 dist_dir=$dist_dir
439 MKDIR=$MKDIR
440 RMFILE=$RMFILE
441 RMDIR=$RMDIR
442 COPYFILE=$COPYFILE
443 COPYALL=$COPYALL
444 SYMLINK=$SYMLINK
445 pkgconfigdir=$pkgconfigdir
446 DOXYGEN=$DOXYGEN
447 __EOF__
448
449
450 #
451 # DEPENDENCIES
452 #
453
454
455
456 # create buffer for make variables required by dependencies
457 echo > "$TEMP_DIR/make.mk"
458
459 test_pkg_config()
460 {
461 if "$PKG_CONFIG" --exists "$1" ; then :
462 else return 1 ; fi
463 if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
464 else return 1 ; fi
465 if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
466 else return 1 ; fi
467 if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
468 else return 1 ; fi
469 return 0
470 }
471
472 print_check_msg()
473 {
474 if [ -z "$1" ]; then
475 shift
476 printf "$@"
477 fi
478 }
479
480 dependency_error_coverage()
481 {
482 print_check_msg "$dep_checked_coverage" "checking for coverage... "
483 # dependency coverage toolchain="gcc"
484 while true
485 do
486 if notistoolchain "gcc"; then
487 break
488 fi
489 if command -v gcovr > /dev/null 2>&1 ; then
490 :
491 else
492 break
493 fi
494 TEMP_CFLAGS="$TEMP_CFLAGS \${COVERAGE_CFLAGS}"
495 TEMP_LDFLAGS="$TEMP_LDFLAGS \${COVERAGE_LDFLAGS}"
496 print_check_msg "$dep_checked_coverage" "yes\n"
497 dep_checked_coverage=1
498 return 1
499 done
500
501 print_check_msg "$dep_checked_coverage" "no\n"
502 dep_checked_coverage=1
503 return 0
504 }
505 dependency_error_mkstemp()
506 {
507 print_check_msg "$dep_checked_mkstemp" "checking for mkstemp... "
508 # dependency mkstemp
509 while true
510 do
511 if $TOOLCHAIN_CC $CFLAGS $LDFLAGS -o /dev/null make/test_mkstemp.c > /dev/null 2>&1 ; then
512 :
513 else
514 break
515 fi
516 TEMP_CFLAGS="$TEMP_CFLAGS -DWITH_MKSTEMP"
517 print_check_msg "$dep_checked_mkstemp" "yes\n"
518 dep_checked_mkstemp=1
519 return 1
520 done
521
522 print_check_msg "$dep_checked_mkstemp" "no\n"
523 dep_checked_mkstemp=1
524 return 0
525 }
526 dependency_error_asan()
527 {
528 print_check_msg "$dep_checked_asan" "checking for asan... "
529 # dependency asan toolchain="gnuc"
530 while true
531 do
532 if notistoolchain "gnuc"; then
533 break
534 fi
535 TEMP_CFLAGS="$TEMP_CFLAGS -fsanitize=address"
536 TEMP_LDFLAGS="$TEMP_LDFLAGS -fsanitize=address"
537 print_check_msg "$dep_checked_asan" "yes\n"
538 dep_checked_asan=1
539 return 1
540 done
541
542 print_check_msg "$dep_checked_asan" "no\n"
543 dep_checked_asan=1
544 return 0
545 }
546 dependency_error_cxx()
547 {
548 print_check_msg "$dep_checked_cxx" "checking for cxx... "
549 # dependency cxx
550 while true
551 do
552 if [ -z "$lang_cpp" ] ; then
553 break
554 fi
555 print_check_msg "$dep_checked_cxx" "yes\n"
556 dep_checked_cxx=1
557 return 1
558 done
559
560 print_check_msg "$dep_checked_cxx" "no\n"
561 dep_checked_cxx=1
562 return 0
563 }
564 dependency_error_memrchr()
565 {
566 print_check_msg "$dep_checked_memrchr" "checking for memrchr... "
567 # dependency memrchr
568 while true
569 do
570 if $TOOLCHAIN_CC $CFLAGS $LDFLAGS -o /dev/null make/test_memrchr.c > /dev/null 2>&1 ; then
571 :
572 else
573 break
574 fi
575 TEMP_CFLAGS="$TEMP_CFLAGS -DWITH_MEMRCHR"
576 print_check_msg "$dep_checked_memrchr" "yes\n"
577 dep_checked_memrchr=1
578 return 1
579 done
580
581 print_check_msg "$dep_checked_memrchr" "no\n"
582 dep_checked_memrchr=1
583 return 0
584 }
585 dependency_error_doxygen()
586 {
587 print_check_msg "$dep_checked_doxygen" "checking for doxygen... "
588 # dependency doxygen
589 while true
590 do
591 if test -n "$DOXYGEN" > /dev/null 2>&1 ; then
592 :
593 else
594 break
595 fi
596 print_check_msg "$dep_checked_doxygen" "yes\n"
597 dep_checked_doxygen=1
598 return 1
599 done
600
601 print_check_msg "$dep_checked_doxygen" "no\n"
602 dep_checked_doxygen=1
603 return 0
604 }
605 dependency_error_no_coverage()
606 {
607 print_check_msg "$dep_checked_no_coverage" "checking for no_coverage... "
608 # dependency no_coverage
609 while true
610 do
611 if test -z "$FEATURE_COVERAGE" > /dev/null 2>&1 ; then
612 :
613 else
614 break
615 fi
616 print_check_msg "$dep_checked_no_coverage" "yes\n"
617 dep_checked_no_coverage=1
618 return 1
619 done
620
621 print_check_msg "$dep_checked_no_coverage" "no\n"
622 dep_checked_no_coverage=1
623 return 0
624 }
625 dependency_error_ubsan()
626 {
627 print_check_msg "$dep_checked_ubsan" "checking for ubsan... "
628 # dependency ubsan toolchain="gnuc"
629 while true
630 do
631 if notistoolchain "gnuc"; then
632 break
633 fi
634 TEMP_CFLAGS="$TEMP_CFLAGS -fsanitize=undefined"
635 TEMP_LDFLAGS="$TEMP_LDFLAGS -fsanitize=undefined"
636 print_check_msg "$dep_checked_ubsan" "yes\n"
637 dep_checked_ubsan=1
638 return 1
639 done
640
641 print_check_msg "$dep_checked_ubsan" "no\n"
642 dep_checked_ubsan=1
643 return 0
644 }
645 dependency_error_qsort_r()
646 {
647 print_check_msg "$dep_checked_qsort_r" "checking for qsort_r... "
648 # dependency qsort_r
649 while true
650 do
651 if $TOOLCHAIN_CC $CFLAGS $LDFLAGS -o /dev/null make/test_qsort_r.c > /dev/null 2>&1 ; then
652 :
653 else
654 break
655 fi
656 TEMP_CFLAGS="$TEMP_CFLAGS -DWITH_QSORT_R"
657 print_check_msg "$dep_checked_qsort_r" "yes\n"
658 dep_checked_qsort_r=1
659 return 1
660 done
661
662 print_check_msg "$dep_checked_qsort_r" "no\n"
663 dep_checked_qsort_r=1
664 return 0
665 }
666
667 # start collecting dependency information
668 echo > "$TEMP_DIR/flags.mk"
669
670 DEPENDENCIES_FAILED=
671 ERROR=0
672 # unnamed dependencies
673 TEMP_CFLAGS="$CFLAGS"
674 TEMP_CXXFLAGS="$CXXFLAGS"
675 TEMP_LDFLAGS="$LDFLAGS"
676 while true
677 do
678 if notisplatform "macos"; then
679 break
680 fi
681 while true
682 do
683 if [ -z "$lang_c" ] ; then
684 ERROR=1
685 break
686 fi
687
688 cat >> "$TEMP_DIR/make.mk" << __EOF__
689 AR=ar
690 ARFLAGS=r
691 STLIB_EXT=.a
692 SHLIB_EXT=.dylib
693
694 SHLIB_LDFLAGS=-dynamiclib -current_version \$(LIBVERSION) -compatibility_version \$(LIBVERSION)
695 INSTALL_LIB=\$(root_dir)/make/install-lib-macos.sh
696 __EOF__
697 break
698 done
699 break
700 done
701 while true
702 do
703 if notisplatform "unix"; then
704 break
705 fi
706 if isplatform "macos" || istoolchain "macos"; then
707 break
708 fi
709 while true
710 do
711 if [ -z "$lang_c" ] ; then
712 ERROR=1
713 break
714 fi
715
716 cat >> "$TEMP_DIR/make.mk" << __EOF__
717 AR=ar
718 ARFLAGS=cr
719 STLIB_EXT=.a
720 SHLIB_EXT=.so
721 INSTALL_LIB=\$(root_dir)/make/install-lib.sh
722 __EOF__
723 break
724 done
725 break
726 done
727 while true
728 do
729 if notistoolchain "gnuc"; then
730 break
731 fi
732 if isplatform "macos" || istoolchain "macos"; then
733 break
734 fi
735 while true
736 do
737
738 cat >> "$TEMP_DIR/make.mk" << __EOF__
739 SHLIB_LDFLAGS += -Wl,-soname,libucx\$(SHLIB_EXT).\$(LIBVERSION_MAJOR)
740 __EOF__
741 break
742 done
743 break
744 done
745 while true
746 do
747 if notistoolchain "suncc"; then
748 break
749 fi
750 while true
751 do
752
753 cat >> "$TEMP_DIR/make.mk" << __EOF__
754 SHLIB_LDFLAGS += -h libucx\$(SHLIB_EXT).\$(LIBVERSION_MAJOR)
755 __EOF__
756 break
757 done
758 break
759 done
760 while true
761 do
762 if notisplatform "solaris"; then
763 break
764 fi
765 while true
766 do
767
768 TEMP_LDFLAGS="$TEMP_LDFLAGS -lm"
769 break
770 done
771 break
772 done
773
774 # build type
775 if [ "$BUILD_TYPE" = "debug" ]; then
776 TEMP_CFLAGS="\${DEBUG_CFLAGS} $TEMP_CFLAGS"
777 TEMP_CXXFLAGS="\${DEBUG_CXXFLAGS} $TEMP_CXXFLAGS"
778 fi
779 if [ "$BUILD_TYPE" = "release" ]; then
780 TEMP_CFLAGS="\${RELEASE_CFLAGS} $TEMP_CFLAGS"
781 TEMP_CXXFLAGS="\${RELEASE_CXXFLAGS} $TEMP_CXXFLAGS"
782 fi
783
784 # add general dependency flags to flags.mk
785 echo "# general flags" >> "$TEMP_DIR/flags.mk"
786 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
787 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
788 fi
789 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
790 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
791 fi
792 if [ -n "${TEMP_LDFLAGS}" ]; then
793 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
794 fi
795
796 #
797 # OPTION VALUES
798 #
799
800 #
801 # TARGETS
802 #
803
804 echo >> "$TEMP_DIR/flags.mk"
805 echo "configuring global target"
806 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
807 TEMP_CFLAGS=
808 TEMP_CXXFLAGS=
809 TEMP_LDFLAGS=
810
811
812 # Features
813 if [ -n "$FEATURE_API_DOCS" ]; then
814 # check dependency
815 if dependency_error_doxygen ; then
816 # "auto" features can fail and are just disabled in this case
817 if [ "$FEATURE_API_DOCS" = "auto" ]; then
818 DISABLE_FEATURE_API_DOCS=1
819 else
820 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED doxygen "
821 ERROR=1
822 fi
823 fi
824 if [ -n "$DISABLE_FEATURE_API_DOCS" ]; then
825 unset FEATURE_API_DOCS
826 fi
827 fi
828 if [ -n "$FEATURE_API_DOCS" ]; then
829 :
830 cat >> "$TEMP_DIR/make.mk" << __EOF__
831 # Documentation
832 WITH_API_DOCS=yes
833 __EOF__
834 else
835 :
836 fi
837 if [ -n "$FEATURE_COVERAGE" ]; then
838 # check dependency
839 if dependency_error_coverage ; then
840 # "auto" features can fail and are just disabled in this case
841 if [ "$FEATURE_COVERAGE" = "auto" ]; then
842 DISABLE_FEATURE_COVERAGE=1
843 else
844 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED coverage "
845 ERROR=1
846 fi
847 fi
848 if [ -n "$DISABLE_FEATURE_COVERAGE" ]; then
849 unset FEATURE_COVERAGE
850 fi
851 fi
852 if [ -n "$FEATURE_COVERAGE" ]; then
853 :
854 else
855 :
856 fi
857 if [ -n "$FEATURE_ASAN" ]; then
858 # check dependency
859 if dependency_error_asan ; then
860 # "auto" features can fail and are just disabled in this case
861 if [ "$FEATURE_ASAN" = "auto" ]; then
862 DISABLE_FEATURE_ASAN=1
863 else
864 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED asan "
865 ERROR=1
866 fi
867 fi
868 if [ -n "$DISABLE_FEATURE_ASAN" ]; then
869 unset FEATURE_ASAN
870 fi
871 fi
872 if [ -n "$FEATURE_ASAN" ]; then
873 :
874 else
875 :
876 fi
877 if [ -n "$FEATURE_UBSAN" ]; then
878 # check dependency
879 if dependency_error_ubsan ; then
880 # "auto" features can fail and are just disabled in this case
881 if [ "$FEATURE_UBSAN" = "auto" ]; then
882 DISABLE_FEATURE_UBSAN=1
883 else
884 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ubsan "
885 ERROR=1
886 fi
887 fi
888 if [ -n "$DISABLE_FEATURE_UBSAN" ]; then
889 unset FEATURE_UBSAN
890 fi
891 fi
892 if [ -n "$FEATURE_UBSAN" ]; then
893 :
894 else
895 :
896 fi
897 if [ -n "$FEATURE_CXX_TESTS" ]; then
898 # check dependency
899 if dependency_error_cxx ; then
900 # "auto" features can fail and are just disabled in this case
901 if [ "$FEATURE_CXX_TESTS" = "auto" ]; then
902 DISABLE_FEATURE_CXX_TESTS=1
903 else
904 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED cxx "
905 ERROR=1
906 fi
907 fi
908 if [ -n "$DISABLE_FEATURE_CXX_TESTS" ]; then
909 unset FEATURE_CXX_TESTS
910 fi
911 fi
912 if [ -n "$FEATURE_CXX_TESTS" ]; then
913 :
914 cat >> "$TEMP_DIR/make.mk" << __EOF__
915 # Enable the check-cxx target
916 WITH_CXX_TEST=yes
917 __EOF__
918 else
919 :
920 fi
921 if [ -n "$FEATURE_SZMUL_BUILTIN" ]; then
922 # check dependency
923 if dependency_error_no_coverage ; then
924 # "auto" features can fail and are just disabled in this case
925 if [ "$FEATURE_SZMUL_BUILTIN" = "auto" ]; then
926 DISABLE_FEATURE_SZMUL_BUILTIN=1
927 else
928 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED no_coverage "
929 ERROR=1
930 fi
931 fi
932 if [ -n "$DISABLE_FEATURE_SZMUL_BUILTIN" ]; then
933 unset FEATURE_SZMUL_BUILTIN
934 fi
935 fi
936 if [ -n "$FEATURE_SZMUL_BUILTIN" ]; then
937 :
938 else
939 :
940 TEMP_CFLAGS="$TEMP_CFLAGS -DCX_NO_SZMUL_BUILTIN"
941 TEMP_CXXFLAGS="$TEMP_CXXFLAGS -DCX_NO_SZMUL_BUILTIN"
942 fi
943 if [ -n "$FEATURE_MEMRCHR" ]; then
944 # check dependency
945 if dependency_error_memrchr ; then
946 # "auto" features can fail and are just disabled in this case
947 if [ "$FEATURE_MEMRCHR" = "auto" ]; then
948 DISABLE_FEATURE_MEMRCHR=1
949 else
950 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED memrchr "
951 ERROR=1
952 fi
953 fi
954 if [ -n "$DISABLE_FEATURE_MEMRCHR" ]; then
955 unset FEATURE_MEMRCHR
956 fi
957 fi
958 if [ -n "$FEATURE_MEMRCHR" ]; then
959 :
960 else
961 :
962 fi
963 if [ -n "$FEATURE_MKSTEMP" ]; then
964 # check dependency
965 if dependency_error_mkstemp ; then
966 # "auto" features can fail and are just disabled in this case
967 if [ "$FEATURE_MKSTEMP" = "auto" ]; then
968 DISABLE_FEATURE_MKSTEMP=1
969 else
970 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED mkstemp "
971 ERROR=1
972 fi
973 fi
974 if [ -n "$DISABLE_FEATURE_MKSTEMP" ]; then
975 unset FEATURE_MKSTEMP
976 fi
977 fi
978 if [ -n "$FEATURE_MKSTEMP" ]; then
979 :
980 else
981 :
982 fi
983 if [ -n "$FEATURE_QSORT_R" ]; then
984 # check dependency
985 if dependency_error_qsort_r ; then
986 # "auto" features can fail and are just disabled in this case
987 if [ "$FEATURE_QSORT_R" = "auto" ]; then
988 DISABLE_FEATURE_QSORT_R=1
989 else
990 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED qsort_r "
991 ERROR=1
992 fi
993 fi
994 if [ -n "$DISABLE_FEATURE_QSORT_R" ]; then
995 unset FEATURE_QSORT_R
996 fi
997 fi
998 if [ -n "$FEATURE_QSORT_R" ]; then
999 :
1000 else
1001 :
1002 fi
1003
1004
1005 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
1006 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
1007 fi
1008 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
1009 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
1010 fi
1011 if [ -n "${TEMP_LDFLAGS}" ]; then
1012 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
1013 fi
1014
1015
1016 # final result
1017 if [ $ERROR -ne 0 ]; then
1018 echo
1019 echo "Error: Unresolved dependencies"
1020 echo "$DEPENDENCIES_FAILED"
1021 abort_configure
1022 fi
1023
1024 echo "configure finished"
1025 echo
1026 echo "Toolchain:"
1027 echo " name: $TOOLCHAIN_NAME"
1028 if [ -n "$TOOLCHAIN_CC" ]; then
1029 echo " cc: $TOOLCHAIN_CC"
1030 fi
1031 if [ -n "$TOOLCHAIN_CXX" ]; then
1032 echo " cxx: $TOOLCHAIN_CXX"
1033 fi
1034 if [ -n "$TOOLCHAIN_WSIZE" ]; then
1035 echo " word size: $TOOLCHAIN_WSIZE bit"
1036 fi
1037 if [ -n "$TOOLCHAIN_CSTD" ]; then
1038 echo " default C std: $TOOLCHAIN_CSTD"
1039 fi
1040 echo
1041 echo "Config:"
1042 printf ' %-16s' 'prefix:'
1043 echo "$prefix"
1044 printf ' %-16s' 'exec-prefix:'
1045 echo "$exec_prefix"
1046 printf ' %-16s' 'libdir:'
1047 echo "$libdir"
1048 printf ' %-16s' 'includedir:'
1049 echo "$includedir"
1050 printf ' %-16s' 'pkgconfigdir:'
1051 echo "$pkgconfigdir"
1052 printf ' %-16s' 'doxygen:'
1053 echo "$DOXYGEN"
1054 echo
1055 echo "Features:"
1056 printf ' %-16s' 'api-docs:'
1057 if [ -n "$FEATURE_API_DOCS" ]; then
1058 echo 'on'
1059 else
1060 echo 'off'
1061 fi
1062 printf ' %-16s' 'coverage:'
1063 if [ -n "$FEATURE_COVERAGE" ]; then
1064 echo 'on'
1065 else
1066 echo 'off'
1067 fi
1068 printf ' %-16s' 'asan:'
1069 if [ -n "$FEATURE_ASAN" ]; then
1070 echo 'on'
1071 else
1072 echo 'off'
1073 fi
1074 printf ' %-16s' 'ubsan:'
1075 if [ -n "$FEATURE_UBSAN" ]; then
1076 echo 'on'
1077 else
1078 echo 'off'
1079 fi
1080 printf ' %-16s' 'cxx-tests:'
1081 if [ -n "$FEATURE_CXX_TESTS" ]; then
1082 echo 'on'
1083 else
1084 echo 'off'
1085 fi
1086 printf ' %-16s' 'szmul-builtin:'
1087 if [ -n "$FEATURE_SZMUL_BUILTIN" ]; then
1088 echo 'on'
1089 else
1090 echo 'off'
1091 fi
1092 printf ' %-16s' 'memrchr:'
1093 if [ -n "$FEATURE_MEMRCHR" ]; then
1094 echo 'on'
1095 else
1096 echo 'off'
1097 fi
1098 printf ' %-16s' 'mkstemp:'
1099 if [ -n "$FEATURE_MKSTEMP" ]; then
1100 echo 'on'
1101 else
1102 echo 'off'
1103 fi
1104 printf ' %-16s' 'qsort_r:'
1105 if [ -n "$FEATURE_QSORT_R" ]; then
1106 echo 'on'
1107 else
1108 echo 'off'
1109 fi
1110 echo
1111
1112 # generate the config.mk file
1113 pwd=`pwd`
1114 cat > "$TEMP_DIR/config.mk" << __EOF__
1115 #
1116 # config.mk generated by:
1117 # pwd: $pwd
1118 # $0 $@
1119 #
1120
1121 __EOF__
1122 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
1123 cat "$TEMP_DIR/config.mk" "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
1124 rm -Rf "$TEMP_DIR"
1125