#!/bin/sh
##############################################################################
# Copyright 2020,2021 Thomas E. Dickey                                       #
# Copyright 1998,2000 Free Software Foundation, Inc.                         #
#                                                                            #
# Permission is hereby granted, free of charge, to any person obtaining a    #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation  #
# the rights to use, copy, modify, merge, publish, distribute, distribute    #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the  #
# following conditions:                                                      #
#                                                                            #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software.                        #
#                                                                            #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
# DEALINGS IN THE SOFTWARE.                                                  #
#                                                                            #
# Except as contained in this notice, the name(s) of the above copyright     #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written               #
# authorization.                                                             #
##############################################################################
#
# Author: Thomas E. Dickey 1996,1997,2000
#
# $Id: makellib,v 1.11 2021/09/04 15:49:38 tom Exp $
# System-dependent wrapper for 'lint' that creates a lint-library via the
# following method (XXX is the name of the library):
#	a.  If the file llib-lXXX doesn't exist, create it using the make-rule
#	b.  Process llib-lXXX with the system's lint utility, making
#	    llib-lXXX.ln
#	c.  Install llib-lXXX.ln in the lib directory.
#
# Using the intermediate file llib-lXXX bypasses a weakness of lint (passing
# through warning messages from the original source-files).
#
# There are two drawbacks to this approach:
#	a.  On a few systems, you'll have to manually-edit the llib-lXXX file
#	    to get a usable lint-library (not all C-preprocessors work well).
#	b.  The system's lint utility won't recognize -lXXX as a lint-library
#	    (Use tdlint as a wrapper; it is designed for this).
#
# Parameters:
#	$1 = library name
#	$* = C-preprocessor options
#
ARCH=`uname -s`
if test "x$ARCH" = "xSunOS" ; then
	case `uname -r` in
	5.*)	ARCH=Solaris
		;;
	esac
fi
#
DST="$HOME/lib/$ARCH/lint"
OPT=""
LLIB=""
llib=""
#
while test $# != 0
do
	case $1 in
	-L*)
		DST="$DST `echo "$1"|sed -e 's/^-L//'`"
		;;
	-*)
		OPT="$OPT $1"
		;;
	*)
		if test -z "$LLIB"
		then
			LLIB=$1
		else
			llib=llib-l$1
		fi
		;;
	esac
	shift
done

if test -z "$LLIB"
then
	echo '? no library name specified'
	exit 1
elif test -z "$llib"
then
	llib="llib-l$LLIB"
fi

if test ! -f "$llib" ; then
	if ( make "$llib" )
	then
		:
	else
		exit 1
	fi
fi

rm -f "$llib.ln" "$llib.c"
TARGET=$LLIB

case "$ARCH" in
AIX)
	CREATE="-uvxo$LLIB -Nn4000"
	TARGET=$llib.c
	ln "$llib" "$TARGET"
	;;
Solaris)
	CREATE="-C$llib"
	TARGET=$llib.c
	ln "$llib" "$TARGET"
	;;
FreeBSD)
	CREATE="-g -z -C$LLIB"
	TARGET=$llib.c
	ln "$llib" "$TARGET"
	;;
CLIX)
	CREATE="-DLINTLIBRARY -vxo$LLIB"
	TARGET=$llib.c
	ln "$llib" "$TARGET"
	;;
IRIX*)
	CREATE="-DLINTLIBRARY -vxyo$LLIB"
	TARGET=$llib.c
	ln "$llib" "$TARGET"
	;;
UNIX_SV)
	CREATE="-DLINTLIBRARY -vxyo$LLIB"
	TARGET=$llib.c
	ln "$llib" "$TARGET"
	;;
*)
	echo "Sorry.  I do not know how to build a lint-library for $ARCH"
	exit 1
esac

echo OPT    "$OPT"
echo TARGET "$TARGET"
echo LIBNAME "$llib"
if ( lint "$CREATE" "$OPT" "$TARGET" )
then
	if test -f "$llib.ln"
	then
		for p in $HOME/lib $HOME/lib/$ARCH $HOME/lib/$ARCH/lint
		do
			if test ! -d "$p"
			then
				mkdir "$p"
			fi
		done
		for p in $DST
		do
			cp "$llib.ln" "$p/"
		done
		rm -f "$llib.ln"
	fi
fi
if test "x$TARGET" = "x$llib.c" ; then
	rm -f "$TARGET"
fi
