summaryrefslogtreecommitdiff
path: root/configure
diff options
context:
space:
mode:
authorThomas Ulmer <thomasmulmer02@gmail.com>2026-06-23 21:34:41 -0700
committerThomas Ulmer <thomasmulmer02@gmail.com>2026-06-23 21:34:41 -0700
commit874d317334fae1ddce316f9b6f4d0ce4e434bf52 (patch)
tree929f924d3c3696d3aa9917aca0e7048bbe3e93e8 /configure
parent15bd7946cc838a3151c357e4b0bc1ab85eecda62 (diff)
heirloom vi fixes from arch AUR
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure333
1 files changed, 333 insertions, 0 deletions
diff --git a/configure b/configure
new file mode 100755
index 0000000..f569405
--- /dev/null
+++ b/configure
@@ -0,0 +1,333 @@
+#!/bin/sh
+
+# Copyright (c) 2016-2018, Carsten Kunze <carsten.kunze@arcor.de>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+usage () {
+ echo "Usage: $0 [-s] [-D<define> ...]"
+ echo " -s Silence output"
+ echo " -D<define>"
+ echo " Add define to CFLAGS"
+ exit $1
+}
+
+SFLAG=
+MAKE=
+DEFS=
+LIB_LEX=
+LIB_CURSES=
+cat /dev/null > compat.h
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ -s)
+ SFLAG=1
+ ;;
+ -D*)
+ DEFS="$DEFS $1"
+ ;;
+ *)
+ echo "$0: $1: Unknown option" >&2
+ usage 1
+ ;;
+ esac
+ shift
+done
+
+check_for () {
+ [ -e $LOG ] && cat <<EOT >>$LOG
+
+================================================================================
+
+EOT
+ A="Checking for $1 ... "
+ printf "$A\n\n" >>$LOG
+ [ -z "$SFLAG" ] && printf "$A"
+}
+
+compile () {
+ rm -f ${TMPNAM}.o $TMPNAM $OUT $ERR
+ $MAKE -f $OUTMK $TMPNAM > $OUT 2> $ERR
+ RESULT=$?
+ cat $OUT $ERR >> $LOG
+ if [ $RESULT -eq 0 ]; then true; else false; fi
+}
+
+test_result () {
+ RESULT=$?
+ RESULT_TEXT=${1:-0} # 1: omit "no", 2: say nothing
+ if [ $RESULT -eq 0 ]; then
+ echo success >>$LOG
+ [ -z "$SFLAG" -a $RESULT_TEXT -lt 2 ] && \
+ echo "yes$PASS_TEXT"
+ PASS_TEXT=
+ [ -e $TMPC ] && rm -f $TMPC
+ true
+ else
+ [ -z "$SFLAG" -a $RESULT_TEXT -lt 1 ] && echo no
+ if [ -e $TMPC ]; then
+ echo "Failed program:" >>$LOG
+ pr -n -t $TMPC >>$LOG
+ rm -f $TMPC
+ fi
+ false
+ fi
+}
+
+gen_mk () {
+ [ $# -eq 0 ] && rm -f $OUTMK
+ [ -n "$LEX" ] && echo "LEX=$LEX" >> $OUTMK
+ [ -n "$FLOAT_STORE" ] && echo "FLOAT_STORE=$FLOAT_STORE" >> $OUTMK
+ [ -n "$DEFS" ] && echo "DEFINES=$DEFS" >> $OUTMK
+ [ -n "$INCDIR_CURSES" ] && echo "INCDIR_CURSES=$INCDIR_CURSES" >> $OUTMK
+ [ -n "$RPATH_CURSES" ] && echo "RPATH_CURSES=$RPATH_CURSES" >> $OUTMK
+ [ -n "$LIBDIR_CURSES" ] && echo "LIBDIR_CURSES=$LIBDIR_CURSES" \
+ >> $OUTMK
+ [ -n "$LIB_CURSES" ] && echo "LIB_CURSES=$LIB_CURSES" >> $OUTMK
+ [ -n "$LIB_AVLBST" ] && echo "LIB_AVLBST=$LIB_AVLBST" >> $OUTMK
+ [ -n "$LIB_LEX" ] && echo "LIB_LEX=$LIB_LEX" >> $OUTMK
+ [ -n "$__CDBG" ] && echo "__CDBG=$__CDBG" >> $OUTMK
+ [ -n "$__CXXDBG" ] && echo "__CXXDBG=$__CXXDBG" >> $OUTMK
+ [ -n "$__CLDBG" ] && echo "__CLDBG=$__CLDBG" >> $OUTMK
+ [ -n "$__CLXXDBG" ] && echo "__CLXXDBG=$__CLXXDBG" >> $OUTMK
+ cat $INMK >> $OUTMK || exit 1
+}
+check_make () {
+ check_for "make(1)"
+
+ cat <<EOT >$TMPMK
+all:
+ true
+EOT
+ make -f $TMPMK >> $LOG 2>&1
+ test_result && {
+ MAKE=make
+ return
+ }
+
+ echo "Failed makefile:" >>$LOG
+ pr -n -t $TMPMK >>$LOG
+
+ check_for "bmake(1)"
+
+ cat <<EOT >$TMPMK
+all:
+ true
+EOT
+ bmake -f $TMPMK >> $LOG 2>&1
+ test_result && MAKE=bmake
+}
+check_strlcpy () {
+ check_for "strlcpy(3)"
+
+ cat <<EOT >$TMPC
+#include <string.h>
+int
+main(int argc, char **argv) {
+ char a[10];
+ (void)argc;
+ strlcpy(a, *argv, sizeof a);
+ return 0;
+}
+EOT
+ compile
+ if test_result; then
+ DEFS="$DEFS -DHAVE_STRLCPY"
+ else
+ H=compat.h
+ grep -q '<sys/types\.h>' $H 2>/dev/null || cat <<EOT >>$H
+#include <sys/types.h>
+EOT
+ cat <<EOT >>$H
+size_t strlcpy(char *, const char *, size_t);
+EOT
+ fi
+}
+check_strlcat () {
+ check_for "strlcat(3)"
+
+ cat <<EOT >$TMPC
+#include <string.h>
+int
+main(int argc, char **argv) {
+ char a[10];
+ (void)argc;
+ *a = 0;
+ strlcat(a, *argv, sizeof a);
+ return 0;
+}
+EOT
+ compile
+ if test_result; then
+ DEFS="$DEFS -DHAVE_STRLCAT"
+ else
+ H=compat.h
+ grep -q '<sys/types\.h>' $H 2>/dev/null || cat <<EOT >>$H
+#include <sys/types.h>
+EOT
+ cat <<EOT >>$H
+size_t strlcat(char *, const char *, size_t);
+EOT
+ fi
+}
+check_Sanitizer () {
+ check_for "CC Sanitizer"
+
+ # C only
+ __CDBG=
+ __CLDBG=
+ __CCXXDBG=
+ # C++ only
+ __CXXDBG=
+ __CLXXDBG=
+ __CDBG="$__CDBG -Wmissing-prototypes"
+ __CDBG="$__CDBG -Wstrict-prototypes"
+ __CCXXDBG="$__CCXXDBG -g -O0 -fno-omit-frame-pointer -fno-optimize-sibling-calls"
+ __CCXXDBG="$__CCXXDBG -Wall"
+ __CCXXDBG="$__CCXXDBG -Wextra"
+ __CCXXDBG="$__CCXXDBG -Wbad-function-cast"
+ __CCXXDBG="$__CCXXDBG -Wcast-align"
+ __CCXXDBG="$__CCXXDBG -Wcast-qual"
+ #__CCXXDBG="$__CCXXDBG -Wconversion"
+ __CCXXDBG="$__CCXXDBG -Wfloat-equal"
+ __CCXXDBG="$__CCXXDBG -Wlogical-not-parentheses"
+ __CCXXDBG="$__CCXXDBG -Wshadow"
+ __CCXXDBG="$__CCXXDBG -Wsign-compare"
+ __CCXXDBG="$__CCXXDBG -Wundef"
+ __CCXXDBG="$__CCXXDBG -Wuninitialized"
+ __CCXXDBG="$__CCXXDBG -Wunused-parameter"
+ __CCXXDBG="$__CCXXDBG -Wunused-function"
+ __CCXXDBG="$__CCXXDBG -Wwrite-strings"
+ __CLXXDBG="$__CLXXDBG -fno-common -fsanitize=address -fsanitize=undefined"
+ #__CLXXDBG="$__CLXXDBG -fsanitize-recover=all"
+
+ [ -n "$CC" ] || CC=cc
+ VER=`$CC --version`
+
+ if echo $VER | grep -iq gcc || echo $VER | \
+ grep -iq 'Free Software Foundation'; then
+ [ -z "$SFLAG" ] && printf "(gcc) "
+ #__CCXXDBG="$__CCXXDBG -Wduplicated-branches"
+ __CCXXDBG="$__CCXXDBG -Wduplicated-cond"
+ __CCXXDBG="$__CCXXDBG -Wjump-misses-init"
+ __CCXXDBG="$__CCXXDBG -Wlogical-op"
+ #__CLXXDBG="$__CLXXDBG -fprofile-arcs -ftest-coverage"
+ __CLXXDBG="$__CLXXDBG -fsanitize=float-divide-by-zero"
+ __CLXXDBG="$__CLXXDBG -fsanitize=float-cast-overflow"
+ elif echo $VER | grep -q clang; then
+ [ -z "$SFLAG" ] && printf "(clang) "
+ __CCXXDBG="$__CCXXDBG -Wincompatible-pointer-types-discards-qualifiers"
+ __CCXXDBG="$__CCXXDBG -Wmissing-variable-declarations"
+ __CXXDBG="$__CXXDBG -Wunused-private-field"
+ __CLXXDBG="$__CLXXDBG -fsanitize=unsigned-integer-overflow"
+ else
+ [ -z "$SFLAG" ] && echo "Unknown compiler"
+ return
+ fi
+
+ # Most C++ options can be used for C too
+ __CDBG="$__CDBG $__CCXXDBG"
+ __CLDBG="$__CLDBG $__CLXXDBG"
+ __CXXDBG="$__CXXDBG $__CCXXDBG"
+ cat <<EOT >$TMPC
+int
+main() {
+ return 0;
+}
+EOT
+ gen_mk
+ cat <<EOT >>$OUTMK
+$TMPNAM: ${TMPNAM}.o
+ \$(CC) \$(__CDBG) \$(__CLDBG) -o \$@ ${TMPNAM}.o
+EOT
+ compile
+ test_result || {
+ __CLDBG=
+ __CLXXDBG=
+ }
+}
+ [ ! -s compat.h ] && rm compat.h
+OUTMK=Makefile
+INMK=${OUTMK}.in
+CFG=config
+TMPNAM=.$CFG
+TMPMK=${TMPNAM}.mk
+TMPC=${TMPNAM}.c
+TMPL=${TMPNAM}.l # For lex tests only ...
+OUT=${TMPNAM}.out
+ERR=${TMPNAM}.err
+LOG=${CFG}.log
+rm -f $LOG
+gen_mk
+
+check_make
+check_strlcpy
+check_strlcat
+#check_Sanitizer
+
+__CLDBG=`echo $__CLDBG | sed 's/-fsanitize=address//'`
+__CLXXDBG=`echo $__CLXXDBG | sed 's/-fsanitize=address//'`
+
+TermTest () {
+ check_for "$1"
+ Term="$1"
+ echo "TERMLIB=$1" > $OUTMK
+ gen_mk 1
+ cat <<EOT >>$OUTMK
+$TMPNAM: ${TMPNAM}.o \$(TLIB)
+ \$(CC) \$(WARN) \$(DEFINES) -o \$@ ${TMPNAM}.o \$(TERMLIB)
+EOT
+ cat <<EOT >>$TMPC
+#include <stdio.h>
+int tgetent(char *, const char *);
+int main() {
+ char tcbuf[2048];
+ char *terms[] = { "xterm", "screen" };
+ unsigned i;
+ for (i = 0; i < sizeof(terms)/sizeof(*terms); i++)
+ if (tgetent(tcbuf, terms[i]) != 1) {
+ fprintf(stderr, "Unknown terminal type \"%s\"\n",
+ terms[i]);
+ return i + 1;
+ }
+ return 0;
+}
+EOT
+ compile
+ test_result 2 && ./$TMPNAM 2>> $LOG && {
+ echo yes
+ return
+ }
+ echo no
+ false
+}
+
+TestLocalTermlib () {
+ #TermTest "-Llibterm -ltermlib" && return
+ TermTest "-ltinfo" && return
+ TermTest "-lncurses" && return
+ ODEFS=$DEFS
+ D="-I/usr/pkg/include -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib"
+ DEFS="$DEFS $D"
+ TermTest "-lncurses $D" && return
+ DEFS=$ODEFS
+ TermTest "-lcurses" && return
+ TermTest "-Llibterm -ltermlib" && return
+}
+
+TestLocalTermlib
+
+echo "TERMLIB=$Term" > $OUTMK
+gen_mk 1
+rm -f $TMPNAM*