Sun, 14 Jan 2024 13:13:12 +0100
add constant for reading out printf sbo size - relates to #343
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 fi
167 if [ "$OS" = "Linux" ]; then
168 PLATFORM="linux unix"
169 fi
170 if [ "$OS" = "FreeBSD" ]; then
171 PLATFORM="freebsd bsd unix"
172 fi
173 if [ "$OS" = "Darwin" ]; then
174 PLATFORM="macos osx bsd unix"
175 fi
176 if 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 }
206 # generate vars.mk
207 cat > "$TEMP_DIR/vars.mk" << __EOF__
208 prefix="$prefix"
209 exec_prefix="$exec_prefix"
210 bindir="$bindir"
211 sbindir="$sbindir"
212 libdir="$libdir"
213 libexecdir="$libexecdir"
214 datarootdir="$datarootdir"
215 datadir="$datadir"
216 sysconfdir="$sysconfdir"
217 sharedstatedir="$sharedstatedir"
218 localstatedir="$localstatedir"
219 runstatedir="$runstatedir"
220 includedir="$includedir"
221 infodir="$infodir"
222 mandir="$mandir"
223 localedir="$localedir"
224 src_dir="$src_dir"
225 DOXYGEN="$DOXYGEN"
226 PANDOC="$PANDOC"
227 __EOF__
229 # toolchain detection utilities
230 . make/toolchain.sh
232 #
233 # DEPENDENCIES
234 #
236 # check languages
237 lang_c=
238 lang_cpp=
239 if detect_c_compiler ; then
240 lang_c=1
241 fi
243 # create buffer for make variables required by dependencies
244 echo > "$TEMP_DIR/make.mk"
246 test_pkg_config()
247 {
248 if "$PKG_CONFIG" --exists "$1" ; then :
249 else return 1 ; fi
250 if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
251 else return 1 ; fi
252 if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
253 else return 1 ; fi
254 if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
255 else return 1 ; fi
256 return 0
257 }
259 print_check_msg()
260 {
261 if [ -z "$1" ]; then
262 shift
263 printf "$@"
264 fi
265 }
267 dependency_error_coverage()
268 {
269 print_check_msg "$dep_checked_coverage" "checking for coverage... "
270 # dependency coverage
271 while true
272 do
273 TEMP_CFLAGS="$TEMP_CFLAGS \${COVERAGE_CFLAGS}"
274 TEMP_LDFLAGS="$TEMP_LDFLAGS \${COVERAGE_LDFLAGS}"
275 print_check_msg "$dep_checked_coverage" "yes\n"
276 dep_checked_coverage=1
277 return 1
278 done
280 print_check_msg "$dep_checked_coverage" "no\n"
281 dep_checked_coverage=1
282 return 0
283 }
284 dependency_error_pandoc()
285 {
286 print_check_msg "$dep_checked_pandoc" "checking for pandoc... "
287 # dependency pandoc
288 while true
289 do
290 if test -n "$PANDOC" > /dev/null ; then
291 :
292 else
293 break
294 fi
295 print_check_msg "$dep_checked_pandoc" "yes\n"
296 dep_checked_pandoc=1
297 return 1
298 done
300 print_check_msg "$dep_checked_pandoc" "no\n"
301 dep_checked_pandoc=1
302 return 0
303 }
304 dependency_error_c()
305 {
306 print_check_msg "$dep_checked_c" "checking for c... "
307 # dependency c platform="mingw"
308 while true
309 do
310 if notisplatform "mingw"; then
311 break
312 fi
313 if [ -z "$lang_c" ] ; then
314 break
315 fi
316 cat >> $TEMP_DIR/make.mk << __EOF__
317 # Dependency: c
318 AR=ar
319 ARFLAGS=r
320 STLIB_EXT=.lib
321 SHLIB_EXT=.dll
323 __EOF__
324 print_check_msg "$dep_checked_c" "yes\n"
325 dep_checked_c=1
326 return 1
327 done
329 # dependency c platform="macos"
330 while true
331 do
332 if notisplatform "macos"; then
333 break
334 fi
335 if [ -z "$lang_c" ] ; then
336 break
337 fi
338 cat >> $TEMP_DIR/make.mk << __EOF__
339 # Dependency: c
340 AR=ar
341 ARFLAGS=r
342 STLIB_EXT=.a
343 SHLIB_EXT=.dylib
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="unix"
352 while true
353 do
354 if notisplatform "unix"; 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=.so
367 __EOF__
368 print_check_msg "$dep_checked_c" "yes\n"
369 dep_checked_c=1
370 return 1
371 done
373 print_check_msg "$dep_checked_c" "no\n"
374 dep_checked_c=1
375 return 0
376 }
377 dependency_error_file_tools()
378 {
379 print_check_msg "$dep_checked_file_tools" "checking for file-tools... "
380 # dependency file-tools
381 while true
382 do
383 cat >> $TEMP_DIR/make.mk << __EOF__
384 # Dependency: file-tools
385 MKDIR=/bin/mkdir -p
386 RMFILE=/bin/rm -f
387 RMDIR=/bin/rm -f -R
388 COPYFILE=/bin/cp -f
389 COPYALL=/bin/cp -f -R
390 SYMLINK=/bin/ln -s
392 __EOF__
393 print_check_msg "$dep_checked_file_tools" "yes\n"
394 dep_checked_file_tools=1
395 return 1
396 done
398 print_check_msg "$dep_checked_file_tools" "no\n"
399 dep_checked_file_tools=1
400 return 0
401 }
402 dependency_error_doxygen()
403 {
404 print_check_msg "$dep_checked_doxygen" "checking for doxygen... "
405 # dependency doxygen
406 while true
407 do
408 if test -n "$DOXYGEN" > /dev/null ; then
409 :
410 else
411 break
412 fi
413 print_check_msg "$dep_checked_doxygen" "yes\n"
414 dep_checked_doxygen=1
415 return 1
416 done
418 print_check_msg "$dep_checked_doxygen" "no\n"
419 dep_checked_doxygen=1
420 return 0
421 }
423 # start collecting dependency information
424 echo > "$TEMP_DIR/flags.mk"
426 DEPENDENCIES_FAILED=
427 ERROR=0
428 # unnamed dependencies
429 TEMP_CFLAGS=
430 TEMP_CXXFLAGS=
431 TEMP_LDFLAGS=
432 while true
433 do
434 while true
435 do
437 cat >> "$TEMP_DIR/make.mk" << __EOF__
438 # library version
439 VERSION=3.1.0
440 LIBVERSION=4.1.0
441 LIBVERSION_MAJOR=4
443 # build directory structure !! do not change or override !!
444 build_dir=${src_dir}/build
445 docs_dir=${src_dir}/build/docs
446 dist_dir=${src_dir}/dist
448 __EOF__
449 break
450 done
451 break
452 done
454 # add general dependency flags to flags.mk
455 echo "# general flags" >> "$TEMP_DIR/flags.mk"
456 if [ -n "${TEMP_CFLAGS}" -a -n "$lang_c" ]; then
457 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
458 fi
459 if [ -n "${TEMP_CXXFLAGS}" -a -n "$lang_cpp" ]; then
460 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
461 fi
462 if [ -n "${TEMP_LDFLAGS}" ]; then
463 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
464 fi
466 #
467 # OPTION VALUES
468 #
469 checkopt_with_docs_all()
470 {
471 VERR=0
472 if dependency_error_pandoc ; then
473 VERR=1
474 fi
475 if dependency_error_doxygen ; then
476 VERR=1
477 fi
478 if [ $VERR -ne 0 ]; then
479 return 1
480 fi
481 cat >> "$TEMP_DIR/make.mk" << __EOF__
482 # Documentation
483 WITH_DOCS_API=yes
484 WITH_DOCS_HTML=yes
486 __EOF__
487 return 0
488 }
489 checkopt_with_docs_html()
490 {
491 VERR=0
492 if dependency_error_pandoc ; then
493 VERR=1
494 fi
495 if [ $VERR -ne 0 ]; then
496 return 1
497 fi
498 cat >> "$TEMP_DIR/make.mk" << __EOF__
499 # Documentation
500 WITH_DOCS_HTML=yes
502 __EOF__
503 return 0
504 }
505 checkopt_with_docs_api()
506 {
507 VERR=0
508 if dependency_error_doxygen ; then
509 VERR=1
510 fi
511 if [ $VERR -ne 0 ]; then
512 return 1
513 fi
514 cat >> "$TEMP_DIR/make.mk" << __EOF__
515 # Documentation
516 WITH_DOCS_API=yes
518 __EOF__
519 return 0
520 }
521 checkopt_with_docs_none()
522 {
523 VERR=0
524 if [ $VERR -ne 0 ]; then
525 return 1
526 fi
527 return 0
528 }
530 #
531 # TARGETS
532 #
534 echo >> "$TEMP_DIR/flags.mk"
535 echo "configuring global target"
536 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
537 TEMP_CFLAGS=
538 TEMP_CXXFLAGS=
539 TEMP_LDFLAGS=
541 if dependency_error_c; then
542 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED c "
543 ERROR=1
544 fi
545 if dependency_error_file_tools; then
546 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED file_tools "
547 ERROR=1
548 fi
550 # Features
551 if [ -n "$FEATURE_COVERAGE" ]; then
552 # check dependency
553 if dependency_error_coverage ; then
554 # "auto" features can fail and are just disabled in this case
555 if [ "$FEATURE_COVERAGE" = "auto" ]; then
556 DISABLE_FEATURE_COVERAGE=1
557 else
558 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED coverage "
559 ERROR=1
560 fi
561 fi
562 if [ -n "$DISABLE_FEATURE_COVERAGE" ]; then
563 unset FEATURE_COVERAGE
564 fi
565 fi
567 # Option: --with-docs
568 if [ -z "$OPT_WITH_DOCS" ]; then
569 echo "auto-detecting option 'with-docs'"
570 SAVED_ERROR="$ERROR"
571 SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED"
572 ERROR=1
573 while true
574 do
575 if checkopt_with_docs_all ; then
576 echo " with-docs: all" >> "$TEMP_DIR/options"
577 ERROR=0
578 break
579 fi
580 if checkopt_with_docs_html ; then
581 echo " with-docs: html" >> "$TEMP_DIR/options"
582 ERROR=0
583 break
584 fi
585 if checkopt_with_docs_api ; then
586 echo " with-docs: api" >> "$TEMP_DIR/options"
587 ERROR=0
588 break
589 fi
590 if checkopt_with_docs_none ; then
591 echo " with-docs: none" >> "$TEMP_DIR/options"
592 ERROR=0
593 break
594 fi
595 break
596 done
597 if [ $ERROR -ne 0 ]; then
598 SAVED_ERROR=1
599 SAVED_DEPENDENCIES_FAILED="option 'with-docs' $SAVED_DEPENDENCIES_FAILED"
600 fi
601 ERROR="$SAVED_ERROR"
602 DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED"
603 else
604 echo "checking option with-docs = $OPT_WITH_DOCS"
605 if false; then
606 false
607 elif [ "$OPT_WITH_DOCS" = "all" ]; then
608 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
609 if checkopt_with_docs_all ; then
610 :
611 else
612 ERROR=1
613 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
614 fi
615 elif [ "$OPT_WITH_DOCS" = "html" ]; then
616 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
617 if checkopt_with_docs_html ; then
618 :
619 else
620 ERROR=1
621 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
622 fi
623 elif [ "$OPT_WITH_DOCS" = "api" ]; then
624 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
625 if checkopt_with_docs_api ; then
626 :
627 else
628 ERROR=1
629 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
630 fi
631 elif [ "$OPT_WITH_DOCS" = "none" ]; then
632 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
633 if checkopt_with_docs_none ; then
634 :
635 else
636 ERROR=1
637 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
638 fi
639 fi
640 fi
642 if [ -n "${TEMP_CFLAGS}" -a -n "$lang_c" ]; then
643 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
644 fi
645 if [ -n "${TEMP_CXXFLAGS}" -a -n "$lang_cpp" ]; then
646 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
647 fi
648 if [ "$BUILD_TYPE" = "debug" ]; then
649 if [ -n "$lang_c" ]; then
650 echo 'CFLAGS += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
651 fi
652 if [ -n "$lang_cpp" ]; then
653 echo 'CXXFLAGS += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
654 fi
655 fi
656 if [ "$BUILD_TYPE" = "release" ]; then
657 if [ -n "$lang_c" ]; then
658 echo 'CFLAGS += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
659 fi
660 if [ -n "$lang_cpp" ]; then
661 echo 'CXXFLAGS += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
662 fi
663 fi
664 if [ -n "${TEMP_LDFLAGS}" ]; then
665 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
666 fi
669 # final result
670 if [ $ERROR -ne 0 ]; then
671 echo
672 echo "Error: Unresolved dependencies"
673 echo "$DEPENDENCIES_FAILED"
674 abort_configure
675 fi
677 echo "configure finished"
678 echo
679 echo "Build Config:"
680 echo " PREFIX: $prefix"
681 echo " TOOLCHAIN: $TOOLCHAIN_NAME"
682 echo "Options:"
683 cat "$TEMP_DIR/options"
684 echo "Features:"
685 if [ -n "$FEATURE_COVERAGE" ]; then
686 echo " coverage: on"
687 else
688 echo " coverage: off"
689 fi
690 echo
692 # generate the config.mk file
693 cat > "$TEMP_DIR/config.mk" << __EOF__
694 #
695 # config.mk generated by configure
696 #
698 __EOF__
699 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
700 cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
701 rm -Rf "$TEMP_DIR"