# $Id: Makefile.in,v 1.46 2020/02/02 23:34:34 tom Exp $
##############################################################################
# Copyright 2019,2020 Thomas E. Dickey                                       #
# Copyright 1998-2013,2015 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-2001
#
# Makefile for ncurses source code.
#
# This makes/installs ncurses include-files
#
# The variable 'srcdir' refers to the source-distribution, and can be set with
# the configure script by "--srcdir=DIR".

# turn off _all_ suffix rules; we'll generate our own
.SUFFIXES:

SHELL		= @SHELL@
VPATH		= @srcdir@
THIS		= Makefile

DESTDIR		= @DESTDIR@
srcdir		= @srcdir@
prefix		= @prefix@
exec_prefix	= @exec_prefix@
includedir	= @includedir@
includesubdir	= @includesubdir@

INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)

INSTALL		= @INSTALL@
INSTALL_DATA	= @INSTALL_DATA@

AWK		= @AWK@
LN_S		= @LN_S@

CTAGS		= @CTAGS@
ETAGS		= @ETAGS@

VERSION		= @cf_cv_rel_version@

# The "Caps" file specifies the terminfo database format, as well as the list
# of function keys.
TERMINFO_CAPS	= $(srcdir)/@TERMINFO_CAPS@
CAPLIST	=	$(TERMINFO_CAPS) \
		$(srcdir)/Caps-ncurses

# These files are generated by the configure script
CONFIG_SRC = \
	MKterm.h.awk \
	curses.head \
	ncurses_dll.h \
	termcap.h \
	unctrl.h

# These files are generated by this makefile
AUTO_SRC = \
	curses.h \
	hashsize.h \
	ncurses_def.h \
	parametrized.h \
	config.h \
	term.h

################################################################################
all \
libs \
depend \
sources \
install ::	$(AUTO_SRC)

curses.h :	$(CAPLIST) \
		curses.head \
		$(srcdir)/curses.tail \
		$(srcdir)/MKkey_defs.sh
	cat curses.head >$@
	AWK=$(AWK) $(SHELL) $(srcdir)/MKkey_defs.sh $(CAPLIST) >>$@
	$(SHELL) -c 'if test "@NCURSES_CH_T@" = "cchar_t" ; then cat $(srcdir)/curses.wide >>$@ ; fi'
	cat $(srcdir)/curses.tail >>$@

term.h: 	$(CAPLIST) \
		MKterm.h.awk
	$(AWK) -f MKterm.h.awk $(CAPLIST) > $@
	$(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@

hashsize.h:	$(CAPLIST) \
		$(srcdir)/MKhashsize.sh
	$(SHELL) $(srcdir)/MKhashsize.sh $(CAPLIST) >$@

ncurses_def.h: $(srcdir)/ncurses_defs $(srcdir)/MKncurses_def.sh
	AWK=$(AWK) $(SHELL) $(srcdir)/MKncurses_def.sh $(srcdir)/ncurses_defs >$@

parametrized.h: $(CAPLIST) \
		$(srcdir)/MKparametrized.sh
	AWK=$(AWK) $(SHELL) $(srcdir)/MKparametrized.sh $(CAPLIST) >$@

# This is required by pthread.h on MinGW
config.h:
	touch $@

tags:
	$(CTAGS) *.[ch]

@MAKE_UPPER_TAGS@TAGS:
@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch]

mostlyclean ::
	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace

clean :: mostlyclean
	-rm -f $(AUTO_SRC)
	-rm -rf *.dSYM

distclean :: clean
	-rm -f Makefile $(CONFIG_SRC) config.h

realclean :: distclean

###############################################################################
# The remainder of this file is automatically generated during configuration
###############################################################################
