#!@SHELL@
# $Id: gen-pkgconfig.in,v 1.56 2022/10/08 16:45:20 tom Exp $
##############################################################################
# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
# Copyright 2009-2015,2018 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
#
# The complete configure script for ncurses is the ncurses5-config (or similar
# name, depending on the flavor, e.g., ncursesw5-config, ncurses6-config, etc).
# That provides more information than pkg-config, and is the portable and
# recommended solution.
#
# For each library, generate a ".pc" file which depends on the base ncurses
# library, except that the tinfo library does not depend on ncurses.
LIB_NAME=@LIB_NAME@
TINFO_NAME=@TINFO_NAME@
PANEL_NAME=@PANEL_NAME@
MENU_NAME=@MENU_NAME@
FORM_NAME=@FORM_NAME@
CXX_NAME=@CXX_NAME@

DFT_DEP_SUFFIX=@DFT_DEP_SUFFIX@
TINFO_ARG_SUFFIX=@TINFO_ARG_SUFFIX@
CXX_LIB_SUFFIX=@CXX_LIB_SUFFIX@

suffix=@PC_MODULE_SUFFIX@
prefix="@prefix@"
exec_prefix="@exec_prefix@"
includedir="@includedir@@includesubdir@"
libdir="@libdir@"

RPATH_LIST=@RPATH_LIST@
PRIVATE_LIBS="@PRIVATE_LIBS@"

show_prefix='@prefix@'
show_exec_prefix='@exec_prefix@'
show_includedir='@includedir@@includesubdir@'
show_libdir='@libdir@'

MAIN_LIBRARY="${LIB_NAME}@USE_ARG_SUFFIX@"
SUB_LIBRARY="${TINFO_ARG_SUFFIX}"

CXX_LIBRARY="${CXX_NAME}@USE_ARG_SUFFIX@"
FORM_LIBRARY="${FORM_NAME}@USE_ARG_SUFFIX@"
MENU_LIBRARY="${MENU_NAME}@USE_ARG_SUFFIX@"
PANEL_LIBRARY="${PANEL_NAME}@USE_ARG_SUFFIX@"

CFLAGS="@PKG_CFLAGS@"
if [ "$includedir" != "/usr/include" ]; then
	includetop=`echo "$includedir" | sed -e 's,/include/[^/]*$,/include,'`
	[ "$includetop" = "/usr/include" ] && includetop="$includedir"
	CFLAGS="$CFLAGS -I\${includedir}"
	if [ "x$includetop" != "x$includedir" ]
	then
		CFLAGS="$CFLAGS -I${includetop}"
	fi
fi

lib_flags=
for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ @LIBS@
do
	case $opt in
	-l*) # LIBS is handled specially below
		continue
		;;
	-specs*) # ignore linker specs-files which were used to build library
		continue
		;;
	-Wl,-z,*) # ignore flags used to manipulate shared image
		continue
		;;
	-Wl,--dynamic-linker*) # ignore ELF interpreter
		continue
		;;
	-Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*)
		continue
		;;
	-L*)
		lib_check=`echo "x$opt" | sed -e 's/^.-L//'`
		# on a new/nonstandard install, $libdir may not yet exist at this point
		if [ "$libdir" != "$lib_check" ]
		then
			[ -d "$lib_check" ] || continue
		fi
		case "$lib_check" in
		@LD_SEARCHPATH@) # skip standard libdir
			if [ "$lib_check" = "$libdir" ]
			then
				lib_first=yes
				IFS_save="$IFS"
				IFS='|'
				LIBDIRS="@LD_SEARCHPATH@"
				for lib_check in $LIBDIRS
				do
					if [ -d "$lib_check" ]
					then
						if [ "$lib_check" != "$libdir" ]
						then
							lib_first=no
						fi
						break
					fi
				done
				IFS="$IFS_save"
				[ $lib_first = yes ] && continue
				found=no
				for check in $lib_flags
				do
					if [ "x$check" = "x$opt" ]
					then
						found=yes
						break
					fi
				done
				[ $found = yes ] && continue
				:
			else
				continue
			fi
			;;
		*)
			found=no
			for check in $lib_flags
			do
				if [ "x$check" = "x$opt" ]
				then
					found=yes
					break
				fi
			done
			[ $found = yes ] && continue
			;;
		esac
		;;
	esac
	lib_flags="$lib_flags $opt"
done

# Check if we should specify the tinfo library explicitly so that terminfo
# functions or curses variables (which also reside in tinfo) can be linked
# using the -lncurses option.
NEED_TINFO=no
if [ "x@TINFO_LIBS@" != "x" ] && \
   [ "x$TINFO_ARG_SUFFIX" != "x$MAIN_LIBRARY" ]
then
	NEED_TINFO=yes
fi

# The "URL" feature came in pkg-config 0.17
USEURL=""
CFGVER=`${PKG_CONFIG:-pkg-config} --version 2>/dev/null |head -n 1 | awk -F. '/0.[0-9][0-9]/{print $2;}'`
# A missing version should simply fail, but some packagers insist on building
# packages on machines which do not actually have the tools they depend on at
# runtime.
[ -z "$CFGVER" ] && CFGVER=30
[ $CFGVER -ge 17 ] || USEURL="#"

for name in @PC_MODULES_TO_MAKE@
do
	name="${name}"
	case $name in
	form*)		name="$FORM_LIBRARY" 	;;
	menu*)		name="$MENU_LIBRARY" 	;;
	panel*)		name="$PANEL_LIBRARY"	;;
	ncurses++*)	name="$CXX_LIBRARY"		;;
	esac
	LIBS="-l$name"

	desc="ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@"
	reqs=

	if [ $name = $MAIN_LIBRARY ]; then
		desc="$desc library"
		[ $NEED_TINFO = yes ] && LIBS="$LIBS -l$TINFO_ARG_SUFFIX"
		[ -n "@LIBS@" ] && LIBS="$LIBS @LIBS@"
	elif [ $name = $SUB_LIBRARY ]; then
		desc="$desc terminal interface library"
	elif expr $name : ".*${CXX_NAME}.*" >/dev/null ; then
		reqs="$PANEL_LIBRARY${suffix}, $MENU_LIBRARY${suffix}, $FORM_LIBRARY${suffix}, $MAIN_LIBRARY${suffix}"
		desc="$desc add-on library"
	else
		reqs="$MAIN_LIBRARY${suffix}"
		desc="$desc add-on library"
	fi

	if [ $name != $SUB_LIBRARY ] && \
	   [ $SUB_LIBRARY != $MAIN_LIBRARY ] && \
	   [ $name != $TINFO_NAME ] && \
	   [ $NEED_TINFO != yes ] ; then
		[ -n "$reqs" ] && reqs="$reqs, "
		reqs="${reqs}${SUB_LIBRARY}${suffix}"
	fi

	if [ $name = $MAIN_LIBRARY ]
	then
		main_libs="$PRIVATE_LIBS"
	else
		main_libs=
	fi

	echo "** creating ${name}${suffix}.pc"
	cat >${name}${suffix}.pc <<EOF
# pkg-config file generated by `basename "$0"`
# vile:makemode

prefix=$show_prefix
exec_prefix=$show_exec_prefix
libdir=$show_libdir
includedir=$show_includedir
abi_version=@cf_cv_abi_version@
major_version=@NCURSES_MAJOR@
version=@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@

Name: ${name}${suffix}
Description: $desc
Version: \${version}
${USEURL}URL: https://invisible-island.net/ncurses
Requires.private: $reqs
Libs: $lib_flags $LIBS
Libs.private: @LIBS@ $main_libs
Cflags: $CFLAGS
EOF

done
# vile:shmode ts=4 sw=4
