Mon, 01 Jan 2024 15:33:20 +0100
move coverage flags to make/*.mk files - relates to #345
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 dependency_error_coverage()
260 {
261 printf "checking for coverage... "
262 # dependency coverage
263 while true
264 do
265 TEMP_CFLAGS="$TEMP_CFLAGS \${COVERAGE_CFLAGS}"
266 TEMP_LDFLAGS="$TEMP_LDFLAGS \${COVERAGE_LDFLAGS}"
267 echo yes
268 return 1
269 done
271 echo no
272 return 0
273 }
274 dependency_error_pandoc()
275 {
276 printf "checking for pandoc... "
277 # dependency pandoc
278 while true
279 do
280 if test -n "$PANDOC" > /dev/null ; then
281 :
282 else
283 break
284 fi
285 echo yes
286 return 1
287 done
289 echo no
290 return 0
291 }
292 dependency_error_c()
293 {
294 printf "checking for c... "
295 # dependency c platform="mingw"
296 while true
297 do
298 if notisplatform "mingw"; then
299 break
300 fi
301 if [ -z "$lang_c" ] ; then
302 break
303 fi
304 cat >> $TEMP_DIR/make.mk << __EOF__
305 # Dependency: c
306 AR=ar
307 ARFLAGS=r
308 STLIB_EXT=.lib
309 SHLIB_EXT=.dll
311 __EOF__
312 echo yes
313 return 1
314 done
316 # dependency c platform="macos"
317 while true
318 do
319 if notisplatform "macos"; then
320 break
321 fi
322 if [ -z "$lang_c" ] ; then
323 break
324 fi
325 cat >> $TEMP_DIR/make.mk << __EOF__
326 # Dependency: c
327 AR=ar
328 ARFLAGS=r
329 STLIB_EXT=.a
330 SHLIB_EXT=.dylib
332 __EOF__
333 echo yes
334 return 1
335 done
337 # dependency c platform="unix"
338 while true
339 do
340 if notisplatform "unix"; then
341 break
342 fi
343 if [ -z "$lang_c" ] ; then
344 break
345 fi
346 cat >> $TEMP_DIR/make.mk << __EOF__
347 # Dependency: c
348 AR=ar
349 ARFLAGS=r
350 STLIB_EXT=.a
351 SHLIB_EXT=.so
353 __EOF__
354 echo yes
355 return 1
356 done
358 echo no
359 return 0
360 }
361 dependency_error_file_tools()
362 {
363 printf "checking for file-tools... "
364 # dependency file-tools
365 while true
366 do
367 cat >> $TEMP_DIR/make.mk << __EOF__
368 # Dependency: file-tools
369 MKDIR=/bin/mkdir -p
370 RMFILE=/bin/rm -f
371 RMDIR=/bin/rm -f -R
372 COPYFILE=/bin/cp -f
373 COPYALL=/bin/cp -f -R
374 SYMLINK=/bin/ln -s
376 __EOF__
377 echo yes
378 return 1
379 done
381 echo no
382 return 0
383 }
384 dependency_error_doxygen()
385 {
386 printf "checking for doxygen... "
387 # dependency doxygen
388 while true
389 do
390 if test -n "$DOXYGEN" > /dev/null ; then
391 :
392 else
393 break
394 fi
395 echo yes
396 return 1
397 done
399 echo no
400 return 0
401 }
406 # start collecting dependency information
407 echo > "$TEMP_DIR/flags.mk"
409 DEPENDENCIES_FAILED=
410 ERROR=0
411 # unnamed dependencies
412 TEMP_CFLAGS=
413 TEMP_CXXFLAGS=
414 TEMP_LDFLAGS=
415 while true
416 do
417 while true
418 do
420 cat >> "$TEMP_DIR/make.mk" << __EOF__
421 # library version
422 VERSION=3.1.0
423 LIBVERSION=4.1.0
424 LIBVERSION_MAJOR=4
426 # build directory structure !! do not change or override !!
427 build_dir=${src_dir}/build
428 docs_dir=${src_dir}/build/docs
429 dist_dir=${src_dir}/dist
431 __EOF__
432 break
433 done
434 break
435 done
437 # add general dependency flags to flags.mk
438 echo "# general flags" >> "$TEMP_DIR/flags.mk"
439 if [ -n "${TEMP_CFLAGS}" -a -n "$lang_c" ]; then
440 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
441 fi
442 if [ -n "${TEMP_CXXFLAGS}" -a -n "$lang_cpp" ]; then
443 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
444 fi
445 if [ -n "${TEMP_LDFLAGS}" ]; then
446 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
447 fi
449 #
450 # OPTION VALUES
451 #
452 checkopt_with_docs_all()
453 {
454 VERR=0
455 if dependency_error_pandoc ; then
456 VERR=1
457 fi
458 if dependency_error_doxygen ; then
459 VERR=1
460 fi
461 if [ $VERR -ne 0 ]; then
462 return 1
463 fi
464 cat >> "$TEMP_DIR/make.mk" << __EOF__
465 # Documentation
466 WITH_DOCS_API=yes
467 WITH_DOCS_HTML=yes
469 __EOF__
470 return 0
471 }
472 checkopt_with_docs_html()
473 {
474 VERR=0
475 if dependency_error_pandoc ; 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_HTML=yes
485 __EOF__
486 return 0
487 }
488 checkopt_with_docs_api()
489 {
490 VERR=0
491 if dependency_error_doxygen ; then
492 VERR=1
493 fi
494 if [ $VERR -ne 0 ]; then
495 return 1
496 fi
497 cat >> "$TEMP_DIR/make.mk" << __EOF__
498 # Documentation
499 WITH_DOCS_API=yes
501 __EOF__
502 return 0
503 }
504 checkopt_with_docs_none()
505 {
506 VERR=0
507 if [ $VERR -ne 0 ]; then
508 return 1
509 fi
510 return 0
511 }
513 #
514 # TARGETS
515 #
517 echo >> "$TEMP_DIR/flags.mk"
518 echo "configuring global target"
519 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
520 TEMP_CFLAGS=
521 TEMP_CXXFLAGS=
522 TEMP_LDFLAGS=
524 if dependency_error_c; then
525 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED c "
526 ERROR=1
527 fi
528 if dependency_error_file_tools; then
529 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED file_tools "
530 ERROR=1
531 fi
533 # Features
534 if [ -n "$FEATURE_COVERAGE" ]; then
535 # check dependency
536 if dependency_error_coverage ; then
537 # "auto" features can fail and are just disabled in this case
538 if [ "$FEATURE_COVERAGE" = "auto" ]; then
539 DISABLE_FEATURE_COVERAGE=1
540 else
541 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED coverage "
542 ERROR=1
543 fi
544 fi
545 if [ -n "$DISABLE_FEATURE_COVERAGE" ]; then
546 unset FEATURE_COVERAGE
547 fi
548 fi
550 # Option: --with-docs
551 if [ -z "$OPT_WITH_DOCS" ]; then
552 echo "auto-detecting option 'with-docs'"
553 SAVED_ERROR="$ERROR"
554 SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED"
555 ERROR=1
556 while true
557 do
558 if checkopt_with_docs_all ; then
559 echo " with-docs: all" >> "$TEMP_DIR/options"
560 ERROR=0
561 break
562 fi
563 if checkopt_with_docs_html ; then
564 echo " with-docs: html" >> "$TEMP_DIR/options"
565 ERROR=0
566 break
567 fi
568 if checkopt_with_docs_api ; then
569 echo " with-docs: api" >> "$TEMP_DIR/options"
570 ERROR=0
571 break
572 fi
573 if checkopt_with_docs_none ; then
574 echo " with-docs: none" >> "$TEMP_DIR/options"
575 ERROR=0
576 break
577 fi
578 break
579 done
580 if [ $ERROR -ne 0 ]; then
581 SAVED_ERROR=1
582 SAVED_DEPENDENCIES_FAILED="option 'with-docs' $SAVED_DEPENDENCIES_FAILED"
583 fi
584 ERROR="$SAVED_ERROR"
585 DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED"
586 else
587 echo "checking option with-docs = $OPT_WITH_DOCS"
588 if false; then
589 false
590 elif [ "$OPT_WITH_DOCS" = "all" ]; then
591 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
592 if checkopt_with_docs_all ; then
593 :
594 else
595 ERROR=1
596 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
597 fi
598 elif [ "$OPT_WITH_DOCS" = "html" ]; then
599 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
600 if checkopt_with_docs_html ; then
601 :
602 else
603 ERROR=1
604 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
605 fi
606 elif [ "$OPT_WITH_DOCS" = "api" ]; then
607 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
608 if checkopt_with_docs_api ; then
609 :
610 else
611 ERROR=1
612 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
613 fi
614 elif [ "$OPT_WITH_DOCS" = "none" ]; then
615 echo " with-docs: $OPT_WITH_DOCS" >> $TEMP_DIR/options
616 if checkopt_with_docs_none ; then
617 :
618 else
619 ERROR=1
620 DEPENDENCIES_FAILED="option 'with-docs' $DEPENDENCIES_FAILED"
621 fi
622 fi
623 fi
625 if [ -n "${TEMP_CFLAGS}" -a -n "$lang_c" ]; then
626 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
627 fi
628 if [ -n "${TEMP_CXXFLAGS}" -a -n "$lang_cpp" ]; then
629 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
630 fi
631 if [ "$BUILD_TYPE" = "debug" ]; then
632 if [ -n "$lang_c" ]; then
633 echo 'CFLAGS += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
634 fi
635 if [ -n "$lang_cpp" ]; then
636 echo 'CXXFLAGS += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
637 fi
638 fi
639 if [ "$BUILD_TYPE" = "release" ]; then
640 if [ -n "$lang_c" ]; then
641 echo 'CFLAGS += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
642 fi
643 if [ -n "$lang_cpp" ]; then
644 echo 'CXXFLAGS += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
645 fi
646 fi
647 if [ -n "${TEMP_LDFLAGS}" ]; then
648 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
649 fi
652 # final result
653 if [ $ERROR -ne 0 ]; then
654 echo
655 echo "Error: Unresolved dependencies"
656 echo "$DEPENDENCIES_FAILED"
657 abort_configure
658 fi
660 echo "configure finished"
661 echo
662 echo "Build Config:"
663 echo " PREFIX: $prefix"
664 echo " TOOLCHAIN: $TOOLCHAIN_NAME"
665 echo "Options:"
666 cat "$TEMP_DIR/options"
667 echo "Features:"
668 if [ -n "$FEATURE_COVERAGE" ]; then
669 echo " coverage: on"
670 else
671 echo " coverage: off"
672 fi
673 echo
675 # generate the config.mk file
676 cat > "$TEMP_DIR/config.mk" << __EOF__
677 #
678 # config.mk generated by configure
679 #
681 __EOF__
682 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
683 cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
684 rm -Rf "$TEMP_DIR"