# $Id: Makefile.in,v 1.53 2021/07/03 18:56:51 tom Exp $
##############################################################################
# Copyright 2019-2020,2021 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-on
#
# 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		= /bin/sh

THIS		= Makefile

DESTDIR		= 
srcdir		= .
prefix		= /usr
exec_prefix	= ${prefix}
includedir	= ${prefix}/include
includesubdir	= 

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

INSTALL		= /usr/bin/install -c
INSTALL_DATA	= ${INSTALL} -m 644

AWK		= mawk
LN_S		= ln -s -f

CC		= gcc
CFLAGS		= -O2 --param max-inline-insns-single=1200 
CPPFLAGS	= -DHAVE_CONFIG_H -I. -I. -I../include -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DNDEBUG

CTAGS		= ctags
ETAGS		= etags

VERSION		= 6.5

# The "Caps" file specifies the terminfo database format, as well as the list
# of function keys.
TERMINFO_CAPS	= $(srcdir)/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

################################################################################

.PHONY :	all
.PHONY :	check
.PHONY :	clean
.PHONY :	depend
.PHONY :	distclean
.PHONY :	install
.PHONY :	install.libs
.PHONY :	libs
.PHONY :	mostlyclean
.PHONY :	realclean
.PHONY :	sources
.PHONY :	uninstall
.PHONY :	uninstall.libs

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 "0" = "1" ; then cat $(srcdir)/curses.events >>$@ ; fi'
	$(SHELL) -c 'if test "cchar_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]

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

# Verify that each header-file can be compiled without including another.
check:
	@$(SHELL) -c "for header in *.h;\
		do \
			echo \"** testing \$${header}\" ; \
			echo \"#include <\$${header}>\" >headers.c; \
			echo \"int main(void) { return 0; }\" >>headers.c; \
			$(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \
		done"
	-@rm -f headers.*

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

# generated by mk-hdr.awk
#  subset:     ticlib+termlib+ext_tinfo+base+widechar+ext_funcs
#  compat:     yes

${INCLUDEDIR} :
	mkdir -p $@

install \
install.libs \
install.includes :: ${AUTO_SRC} ${INCLUDEDIR} \
		curses.h \
		unctrl.h \
		ncurses_dll.h \
		term.h \
		termcap.h \
		$(srcdir)/term_entry.h
	@ (cd ${INCLUDEDIR} && rm -f curses.h) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} curses.h
	@ (cd ${INCLUDEDIR} && rm -f ncurses.h && ${LN_S} curses.h ncurses.h)
	@ (cd ${INCLUDEDIR} && rm -f unctrl.h) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} unctrl.h
	@ (cd ${INCLUDEDIR} && rm -f ncurses_dll.h) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} ncurses_dll.h
	@ (cd ${INCLUDEDIR} && rm -f term.h) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} term.h
	@ (cd ${INCLUDEDIR} && rm -f termcap.h) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} termcap.h
	@ (cd ${INCLUDEDIR} && rm -f term_entry.h) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} $(srcdir)/term_entry.h

uninstall \
uninstall.libs \
uninstall.includes ::
	-@ (cd ${INCLUDEDIR} && rm -f curses.h)
	-@ (cd ${INCLUDEDIR} && rm -f ncurses.h)
	-@ (cd ${INCLUDEDIR} && rm -f unctrl.h)
	-@ (cd ${INCLUDEDIR} && rm -f ncurses_dll.h)
	-@ (cd ${INCLUDEDIR} && rm -f term.h)
	-@ (cd ${INCLUDEDIR} && rm -f termcap.h)
	-@ (cd ${INCLUDEDIR} && rm -f term_entry.h)
