Fri, 12 Apr 2024 21:48:12 +0200
improves interface of cx_sprintf() variants
1 #!/bin/sh
3 # create temporary directory
4 TEMP_DIR=".tmp-`uname -n`"
5 rm -Rf "$TEMP_DIR"
6 if mkdir -p "$TEMP_DIR"; then
7 :
8 else
9 echo "Cannot create tmp dir $TEMP_DIR"
10 echo "Abort"
11 exit 1
12 fi
13 touch "$TEMP_DIR/options"
14 touch "$TEMP_DIR/features"
16 # define standard variables
17 # also define standard prefix (this is where we will search for config.site)
18 prefix=/usr
19 exec_prefix=
20 bindir=
21 sbindir=
22 libdir=
23 libexecdir=
24 datarootdir=
25 datadir=
26 sysconfdir=
27 sharedstatedir=
28 localstatedir=
29 runstatedir=
30 includedir=
31 infodir=
32 localedir=
33 mandir=
35 # custom variables
36 src_dir=`pwd`
37 DOXYGEN=`command -v doxygen`
38 PANDOC=`command -v pandoc`
40 # features
42 # clean abort
43 abort_configure()
44 {
45 rm -Rf "$TEMP_DIR"
46 exit 1
47 }
49 # help text
50 printhelp()
51 {
52 echo "Usage: $0 [OPTIONS]..."
53 cat << __EOF__
54 Installation directories:
55 --prefix=PREFIX path prefix for architecture-independent files
56 [/usr]
57 --exec-prefix=EPREFIX path prefix for architecture-dependent files
58 [PREFIX]
60 --bindir=DIR user executables [EPREFIX/bin]
61 --sbindir=DIR system admin executables [EPREFIX/sbin]
62 --libexecdir=DIR program executables [EPREFIX/libexec]
63 --sysconfdir=DIR system configuration files [PREFIX/etc]
64 --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
65 --localstatedir=DIR modifiable single-machine data [PREFIX/var]
66 --runstatedir=DIR run-time variable data [LOCALSTATEDIR/run]
67 --libdir=DIR object code libraries [EPREFIX/lib]
68 --includedir=DIR C header files [PREFIX/include]
69 --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
70 --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
71 --infodir=DIR info documentation [DATAROOTDIR/info]
72 --mandir=DIR man documentation [DATAROOTDIR/man]
73 --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
75 Options:
76 --debug add extra compile flags for debug builds
77 --release add extra compile flags for release builds
78 --with-docs=(all|html|api|none)
80 Optional Features:
81 --enable-coverage
83 __EOF__
84 }
86 #
87 # parse arguments
88 #
89 BUILD_TYPE="default"
90 for ARG in "$@"
91 do
92 case "$ARG" in
93 "--prefix="*) prefix=${ARG#--prefix=} ;;
94 "--exec-prefix="*) exec_prefix=${ARG#--exec-prefix=} ;;
95 "--bindir="*) bindir=${ARG#----bindir=} ;;
96 "--sbindir="*) sbindir=${ARG#--sbindir=} ;;
97 "--libdir="*) libdir=${ARG#--libdir=} ;;
98 "--libexecdir="*) libexecdir=${ARG#--libexecdir=} ;;
99 "--datarootdir="*) datarootdir=${ARG#--datarootdir=} ;;
100 "--datadir="*) datadir=${ARG#--datadir=} ;;
101 "--sysconfdir="*) sysconfdir=${ARG#--sysconfdir=} ;;
102 "--sharedstatedir="*) sharedstatedir=${ARG#--sharedstatedir=} ;;
103 "--localstatedir="*) localstatedir=${ARG#--localstatedir=} ;;
104 "--includedir="*) includedir=${ARG#--includedir=} ;;
105 "--infodir="*) infodir=${ARG#--infodir=} ;;
106 "--mandir"*) mandir=${ARG#--mandir} ;;
107 "--localedir"*) localedir=${ARG#--localedir} ;;
108 "--help"*) printhelp; abort_configure ;;
109 "--debug") BUILD_TYPE="debug" ;;
110 "--release") BUILD_TYPE="release" ;;
111 "--with-docs="*) OPT_WITH_DOCS=${ARG#--with-docs=} ;;
112 "--enable-coverage") FEATURE_COVERAGE=on ;;
113 "--disable-coverage") unset FEATURE_COVERAGE ;;
114 "-"*) echo "unknown option: $ARG"; abort_configure ;;
115 esac
116 done
120 # set defaults for dir variables
121 : ${exec_prefix:="$prefix"}
122 : ${bindir:='${exec_prefix}/bin'}
123 : ${sbindir:='${exec_prefix}/sbin'}
124 : ${libdir:='${exec_prefix}/lib'}
125 : ${libexecdir:='${exec_prefix}/libexec'}
126 : ${datarootdir:='${prefix}/share'}
127 : ${datadir:='${datarootdir}'}
128 : ${sysconfdir:='${prefix}/etc'}
129 : ${sharedstatedir:='${prefix}/com'}
130 : ${localstatedir:='${prefix}/var'}
131 : ${runstatedir:='${localstatedir}/run'}
132 : ${includedir:='${prefix}/include'}
133 : ${infodir:='${datarootdir}/info'}
134 : ${mandir:='${datarootdir}/man'}
135 : ${localedir:='${datarootdir}/locale'}
137 # check if a config.site exists and load it
138 if [ -n "$CONFIG_SITE" ]; then
139 # CONFIG_SITE may contain space separated file names
140 for cs in $CONFIG_SITE; do
141 printf "loading defaults from $cs... "
142 . "$cs"
143 echo ok
144 done
145 elif [ -f "$prefix/share/config.site" ]; then
146 printf "loading site defaults... "
147 . "$prefix/share/config.site"
148 echo ok
149 elif [ -f "$prefix/etc/config.site" ]; then
150 printf "loading site defaults... "
151 . "$prefix/etc/config.site"
152 echo ok
153 fi
155 # Test for availability of pkg-config
156 PKG_CONFIG=`command -v pkg-config`
157 : ${PKG_CONFIG:="false"}
159 # Simple uname based platform detection
160 # $PLATFORM is used for platform dependent dependency selection
161 OS=`uname -s`
162 OS_VERSION=`uname -r`
163 printf "detect platform... "
164 if [ "$OS" = "SunOS" ]; then
165 PLATFORM="solaris sunos unix svr4"
166 elif [ "$OS" = "Linux" ]; then
167 PLATFORM="linux unix"
168 elif [ "$OS" = "FreeBSD" ]; then
169 PLATFORM="freebsd bsd unix"
170 elif [ "$OS" = "OpenBSD" ]; then
171 PLATFORM="openbsd bsd unix"
172 elif [ "$OS" = "NetBSD" ]; then
173 PLATFORM="netbsd bsd unix"
174 elif [ "$OS" = "Darwin" ]; then
175 PLATFORM="macos osx bsd unix"
176 elif echo "$OS" | grep -i "MINGW" > /dev/null; then
177 PLATFORM="windows mingw"
178 fi
179 : ${PLATFORM:="unix"}
181 PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -`
182 echo "$PLATFORM_NAME"
184 isplatform()
185 {
186 for p in $PLATFORM
187 do
188 if [ "$p" = "$1" ]; then
189 return 0
190 fi
191 done
192 return 1
193 }
194 notisplatform()
195 {
196 for p in $PLATFORM
197 do
198 if [ "$p" = "$1" ]; then
199 return 1
200 fi
201 done
202 return 0
203 }
204 istoolchain()
205 {
206 for t in $TOOLCHAIN
207 do
208 if [ "$t" = "$1" ]; then
209 return 0
210 fi
211 done
212 return 1
213 }
214 notistoolchain()
215 {
216 for t in $TOOLCHAIN
217 do
218 if [ "$t" = "$1" ]; then
219 return 1
220 fi
221 done
222 return 0
223 }
226 # generate vars.mk
227 cat > "$TEMP_DIR/vars.mk" << __EOF__
228 prefix=$prefix
229 exec_prefix=$exec_prefix
230 bindir=$bindir
231 sbindir=$sbindir
232 libdir=$libdir
233 libexecdir=$libexecdir
234 datarootdir=$datarootdir
235 datadir=$datadir
236 sysconfdir=$sysconfdir
237 sharedstatedir=$sharedstatedir
238 localstatedir=$localstatedir
239 runstatedir=$runstatedir
240 includedir=$includedir
241 infodir=$infodir
242 mandir=$mandir
243 localedir=$localedir
244 src_dir=$src_dir
245 DOXYGEN=$DOXYGEN
246 PANDOC=$PANDOC
247 __EOF__
249 # toolchain detection utilities
250 . make/toolchain.sh
252 #
253 # DEPENDENCIES
254 #
256 # check languages
257 lang_c=
258 lang_cpp=
259 if detect_c_compiler ; then
260 lang_c=1
261 fi
263 # create buffer for make variables required by dependencies
264 echo > "$TEMP_DIR/make.mk"
266 test_pkg_config()
267 {
268 if "$PKG_CONFIG" --exists "$1" ; then :
269 else return 1 ; fi
270 if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
271 else return 1 ; fi
272 if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
273 else return 1 ; fi
274 if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
275 else return 1 ; fi
276 return 0
277 }
279 print_check_msg()
280 {
281 if [ -z "$1" ]; then
282 shift
283 printf "$@"
284 fi
285 }
287 dependency_error_coverage()
288 {
289 print_check_msg "$dep_checked_coverage" "checking for coverage... "
290 # dependency coverage toolchain="gnuc"
291 while true
292 do
293 if notistoolchain "gnuc"; then
294 break
295 fi
296 TEMP_CFLAGS="$TEMP_CFLAGS \${COVERAGE_CFLAGS}"
297 TEMP_LDFLAGS="$TEMP_LDFLAGS \${COVERAGE_LDFLAGS}"
298 print_check_msg "$dep_checked_coverage" "yes\n"
299 dep_checked_coverage=1
300 return 1
301 done
303 print_check_msg "$dep_checked_coverage" "no\n"
304 dep_checked_coverage=1
305 return 0
306 }
307 dependency_error_pandoc()
308 {
309 print_check_msg "$dep_checked_pandoc" "checking for pandoc... "
310 # dependency pandoc
311 while true
312 do
313 if test -n "$PANDOC" > /dev/null ; then
314 :
315 else
316 break
317 fi
318 print_check_msg "$dep_checked_pandoc" "yes\n"
319 dep_checked_pandoc=1
320 return 1
321 done
323 print_check_msg "$dep_checked_pandoc" "no\n"
324 dep_checked_pandoc=1
325 return 0
326 }
327 dependency_error_c()
328 {
329 print_check_msg "$dep_checked_c" "checking for c... "
330 # dependency c platform="mingw"
331 while true
332 do
333 if notisplatform "mingw"; then
334 break
335 fi
336 if [ -z "$lang_c" ] ; then
337 break
338 fi
339 cat >> $TEMP_DIR/make.mk << __EOF__
340 # Dependency: c
341 AR=ar
342 ARFLAGS=r
343 STLIB_EXT=.lib
344 SHLIB_EXT=.dll
345 __EOF__
346 print_check_msg "$dep_checked_c" "yes\n"
347 dep_checked_c=1
348 return 1
349 done
351 # dependency c platform="macos"
352 while true
353 do
354 if notisplatform "macos"; then
355 break
356 fi
357 if [ -z "$lang_c" ] ; then
358 break
359 fi
360 cat >> $TEMP_DIR/make.mk << __EOF__
361 # Dependency: c
362 AR=ar
363 ARFLAGS=r
364 STLIB_EXT=.a
365 SHLIB_EXT=.dylib
366 __EOF__
367 print_check_msg "$dep_checked_c" "yes\n"
368 dep_checked_c=1
369 return 1
370 done
372 # dependency c platform="unix"
373 while true
374 do
375 if notisplatform "unix"; then
376 break
377 fi
378 if [ -z "$lang_c" ] ; then
379 break
380 fi
381 cat >> $TEMP_DIR/make.mk << __EOF__
382 # Dependency: c
383 AR=ar
384 ARFLAGS=r
385 STLIB_EXT=.a
386 SHLIB_EXT=.so
387 __EOF__
388 print_check_msg "$dep_checked_c" "yes\n"
389 dep_checked_c=1
390 return 1
391 done
393 print_check_msg "$dep_checked_c" "no\n"
394 dep_checked_c=1
395 return 0
396 }
397 dependency_error_file_tools()
398 {
399 print_check_msg "$dep_checked_file_tools" "checking for file_tools... "
400 # dependency file-tools
401 while true
402 do
403 cat >> $TEMP_DIR/make.mk << __EOF__
404 # Dependency: file_tools
405 MKDIR=/bin/mkdir -p
406 RMFILE=/bin/rm -f
407 RMDIR=/bin/rm -f -R
408 COPYFILE=/bin/cp -f
409 COPYALL=/bin/cp -f -R
410 SYMLINK=/bin/ln -s
411 __EOF__
412 print_check_msg "$dep_checked_file_tools" "yes\n"
413 dep_checked_file_tools=1
414 return 1
415 done
417 print_check_msg "$dep_checked_file_tools" "no\n"
418 dep_checked_file_tools=1
419 return 0
420 }
421 dependency_error_doxygen()
422 {
423 print_check_msg "$dep_checked_doxygen" "checking for doxygen... "
424 # dependency doxygen
425 while true
426 do
427 if test -n "$DOXYGEN" > /dev/null ; then
428 :
429 else
430 break
431 fi
432 print_check_msg "$dep_checked_doxygen" "yes\n"
433 dep_checked_doxygen=1
434 return 1
435 done
437 print_check_msg "$dep_checked_doxygen" "no\n"
438 dep_checked_doxygen=1
439 return 0
440 }
442 # start collecting dependency information
443 echo > "$TEMP_DIR/flags.mk"
445 DEPENDENCIES_FAILED=
446 ERROR=0
447 # unnamed dependencies
448 TEMP_CFLAGS=
449 TEMP_CXXFLAGS=
450 TEMP_LDFLAGS=
451 while true
452 do
453 while true
454 do
456 cat >> "$TEMP_DIR/make.mk" << __EOF__
457 # library version
458 VERSION=3.1.0
459 LIBVERSION=5.0.0
460 LIBVERSION_MAJOR=5
462 # build directory structure !! do not change or override !!
463 build_dir=${src_dir}/build
464 docs_dir=${src_dir}/build/docs
465 dist_dir=${src_dir}/dist
466 __EOF__
467 break
468 done
469 break
470 done
471 while true
472 do
473 if notisplatform "solaris"; then
474 break
475 fi
476 while true
477 do
479 TEMP_LDFLAGS="$TEMP_LDFLAGS -lm"
480 break
481 done
482 break
483 done
485 # add general dependency flags to flags.mk
486 echo "# general flags" >> "$TEMP_DIR/flags.mk"
487 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
488 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
489 fi
490 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
491 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
492 fi
493 if [ -n "${TEMP_LDFLAGS}" ]; then
494 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
495 fi
497 #
498 # OPTION VALUES
499 #
500 checkopt_with_docs_all()
501 {
502 VERR=0
503 if dependency_error_pandoc ; then
504 VERR=1
505 fi
506 if dependency_error_doxygen ; then
507 VERR=1
508 fi
509 if [ $VERR -ne 0 ]; then
510 return 1
511 fi
512 cat >> "$TEMP_DIR/make.mk" << __EOF__
513 # Documentation
514 WITH_DOCS_API=yes
515 WITH_DOCS_HTML=yes
516 __EOF__
517 return 0
518 }
519 checkopt_with_docs_html()
520 {
521 VERR=0
522 if dependency_error_pandoc ; then
523 VERR=1
524 fi
525 if [ $VERR -ne 0 ]; then
526 return 1
527 fi
528 cat >> "$TEMP_DIR/make.mk" << __EOF__
529 # Documentation
530 WITH_DOCS_HTML=yes
531 __EOF__
532 return 0
533 }
534 checkopt_with_docs_api()
535 {
536 VERR=0
537 if dependency_error_doxygen ; then
538 VERR=1
539 fi
540 if [ $VERR -ne 0 ]; then
541 return 1
542 fi
543 cat >> "$TEMP_DIR/make.mk" << __EOF__
544 # Documentation
545 WITH_DOCS_API=yes
546 __EOF__
547 return 0
548 }
549 checkopt_with_docs_none()
550 {
551 VERR=0
552 if [ $VERR -ne 0 ]; then
553 return 1
554 fi
555 return 0
556 }
558 #
559 # TARGETS
560 #
562 echo >> "$TEMP_DIR/flags.mk"
563 echo "configuring global target"
564 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
565 TEMP_CFLAGS=
566 TEMP_CXXFLAGS=
567 TEMP_LDFLAGS=
569 if dependency_error_c; then
570 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED c "
571 ERROR=1
572 fi
573 if dependency_error_file_tools; then
574 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED file_tools "
575 ERROR=1
576 fi
578 # Features
579 if [ -n "$FEATURE_COVERAGE" ]; then
580 # check dependency
581 if dependency_error_coverage ; then
582 # "auto" features can fail and are just disabled in this case
583 if [ "$FEATURE_COVERAGE" = "auto" ]; then
584 DISABLE_FEATURE_COVERAGE=1
585 else
586 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED coverage "
587 ERROR=1
588 fi
589 fi
590 if [ -n "$DISABLE_FEATURE_COVERAGE" ]; then
591 unset FEATURE_COVERAGE
592 fi
593 fi
595 # Option: --with-docs
596 if [ -z "$OPT_WITH_DOCS" ]; then
597 echo "auto-detecting option 'with-docs'"
598 SAVED_ERROR="$ERROR"
599 SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED"
600 ERROR=1
601 while true
602 do
603 if checkopt_with_docs_all ; then
604 echo " with-docs: all" >> "$TEMP_DIR/options"
605 ERROR=0
606 break
607 fi
608 if checkopt_with_docs_html ; then
609 echo " with-docs: html" >> "$TEMP_DIR/options"
610 ERROR=0
611 break
612 fi
613 if checkopt_with_docs_api ; then
614 echo " with-docs: api" >> "$TEMP_DIR/options"
615 ERROR=0
616 break
617 fi
618 if checkopt_with_docs_none ; then
619 echo " with-docs: none" >> "$TEMP_DIR/options"
620 ERROR=0
621 break
622 fi
623 break
624 done
625 if [ $ERROR -ne 0 ]; then
626 SAVED_ERROR=1
627 SAVED_DEPENDENCIES_FAILED="option 'with-docs' $SAVED_DEPENDENCIES_FAILED"
628 fi
629 ERROR="$SAVED_ERROR"
630 DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED"
631 else
632 echo "checking option with-docs = $OPT_WITH_DOCS"
633 if false; then
634 false
635 elif [ "$OPT_WITH_DOCS" = "all" ]; then
636 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
637 if checkopt_with_docs_all ; then
638 :
639 else
640 ERROR=1
641 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
642 fi
643 elif [ "$OPT_WITH_DOCS" = "html" ]; then
644 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
645 if checkopt_with_docs_html ; then
646 :
647 else
648 ERROR=1
649 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
650 fi
651 elif [ "$OPT_WITH_DOCS" = "api" ]; then
652 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
653 if checkopt_with_docs_api ; then
654 :
655 else
656 ERROR=1
657 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
658 fi
659 elif [ "$OPT_WITH_DOCS" = "none" ]; then
660 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
661 if checkopt_with_docs_none ; then
662 :
663 else
664 ERROR=1
665 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
666 fi
667 fi
668 fi
670 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then
671 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
672 fi
673 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then
674 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
675 fi
676 if [ "$BUILD_TYPE" = "debug" ]; then
677 if [ -n "$lang_c" ]; then
678 echo 'CFLAGS += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
679 fi
680 if [ -n "$lang_cpp" ]; then
681 echo 'CXXFLAGS += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
682 fi
683 fi
684 if [ "$BUILD_TYPE" = "release" ]; then
685 if [ -n "$lang_c" ]; then
686 echo 'CFLAGS += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
687 fi
688 if [ -n "$lang_cpp" ]; then
689 echo 'CXXFLAGS += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
690 fi
691 fi
692 if [ -n "${TEMP_LDFLAGS}" ]; then
693 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
694 fi
697 # final result
698 if [ $ERROR -ne 0 ]; then
699 echo
700 echo "Error: Unresolved dependencies"
701 echo "$DEPENDENCIES_FAILED"
702 abort_configure
703 fi
705 echo "configure finished"
706 echo
707 echo "Build Config:"
708 echo " PREFIX: $prefix"
709 echo " TOOLCHAIN: $TOOLCHAIN_NAME"
710 echo "Options:"
711 cat "$TEMP_DIR/options"
712 echo "Features:"
713 if [ -n "$FEATURE_COVERAGE" ]; then
714 echo " coverage: on"
715 else
716 echo " coverage: off"
717 fi
718 echo
720 # generate the config.mk file
721 cat > "$TEMP_DIR/config.mk" << __EOF__
722 #
723 # config.mk generated by configure
724 #
726 __EOF__
727 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
728 cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
729 rm -Rf "$TEMP_DIR"