LICENSE   := MIT
VERSION   := 5.9
DOWNLOADS := ncurses.archive

URL(ncurses) := http://ftp.gnu.org/pub/gnu/ncurses/ncurses-$(VERSION).tar.gz
SHA(ncurses) := 3e042e5f2c7223bffdaac9646a533b8c758b65b5
SIG(ncurses) := ${URL(ncurses)}.sig
DIR(ncurses) := src/lib/ncurses

DIRS := include/ncurses
DIR_CONTENT(include/ncurses) := \
    $(addprefix src/lib/ncurses/include/,\
         nc_alloc.h nc_panel.h nc_tparm.h term_entry.h tic.h hashed_db.h \
         capdefaults.c)

$(call check_tool,sed)
$(call check_tool,mawk)

gen_inc   := curses.h ncurses_def.h ncurses_dll.h term.h \
             unctrl.h termcap.h parametrized.h hashsize.h \
             init_keytry.h keys.list make_keys MKterm.h.awk

gen_src   := names.c unctrl.c fallback.c comp_captab.c codes.c

gen_tools := make_hash make_keys

gen_files := $(addprefix include/ncurses/,$(gen_inc)) \
             $(addprefix src/lib/ncurses/,$(gen_src)) \
             $(addprefix src/lib/ncurses/,$(gen_tools))

default: $(gen_files) cleanup_gen_tools

$(gen_files): _dirs

cleanup_gen_tools: $(gen_files)
	$(VERBOSE)rm $(addprefix src/lib/ncurses/,$(gen_tools))

#
# Generate headers and source codes
#

subst := \
	"@NCURSES_MAJOR@/5" \
	"@NCURSES_MINOR@/9" \
	"@NCURSES_PATCH@/20110404" \
	"@NCURSES_MOUSE_VERSION@/1" \
	"@NCURSES_CONST@/\/*nothing*\/" \
	"@NCURSES_INLINE@/inline" \
	"@NCURSES_OPAQUE@/0" \
	"@NCURSES_INTEROP_FUNCS@/0" \
	"@NCURSES_SIZE_T@/short" \
	"@NCURSES_TPARM_VARARGS@/1" \
	"@NCURSES_CH_T@/chtype" \
	"@NCURSES_LIBUTF8@/0" \
	"@NCURSES_OSPEED@/short" \
	"@NCURSES_WCHAR_T@/0" \
	"@NCURSES_WINT_T@/0" \
	"@NCURSES_SBOOL@/char" \
	"@NCURSES_XNAMES@/1" \
	"@HAVE_TERMIOS_H@/1" \
	"@HAVE_TCGETATTR@/1" \
	"@NCURSES_CCHARW_MAX@/5" \
	"@NCURSES_EXT_COLORS@/0" \
	"@NCURSES_EXT_FUNCS@/1" \
	"@NCURSES_SP_FUNCS@/0" \
	"@NCURSES_OK_WCHAR_T@/" \
	"@NCURSES_WRAP_PREFIX@/_nc_" \
	"@cf_cv_header_stdbool_h@/1" \
	"@cf_cv_enable_opaque@/NCURSES_OPAQUE" \
	"@cf_cv_enable_reentrant@/0" \
	"@cf_cv_enable_lp64@/0" \
	"@cf_cv_typeof_chtype@/long" \
	"@cf_cv_typeof_mmask_t@/long" \
	"@cf_cv_type_of_bool@/unsigned char" \
	"@cf_cv_1UL@/1UL" \
	"@USE_CXX_BOOL@/defined(__cplusplus)" \
	"@BROKEN_LINKER@/0" \
	"@NEED_WCHAR_H@/0" \
	"@GENERATED_EXT_FUNCS@/generated" \
	"@HAVE_TERMIO_H@/1" \
	"@HAVE_VSSCANF@/1"

apply_substitutions = $(VERBOSE)for i in $(subst); do sed -i "s/$$i/g" $(1); done

ncurses_include_dir := src/lib/ncurses/include
ncurses_src_dir     := src/lib/ncurses/ncurses

include/ncurses/curses.h:
	@$(MSG_GENERATE)$@
	$(VERBOSE)cp src/lib/ncurses/include/curses.h.in $@
	$(call apply_substitutions,$@)
	$(VERBOSE)AWK=mawk sh $(ncurses_include_dir)/MKkey_defs.sh $(ncurses_include_dir)/Caps >> $@
	$(VERBOSE)cat $(ncurses_include_dir)/curses.tail >> $@

include/ncurses/ncurses_def.h:
	@$(MSG_GENERATE)$@
	$(VERBOSE)AWK=mawk sh $(ncurses_include_dir)/MKncurses_def.sh $(ncurses_include_dir)/ncurses_defs > $@

include/ncurses/parametrized.h:
	@$(MSG_GENERATE)$@
	$(VERBOSE)AWK=mawk sh $(ncurses_include_dir)/MKparametrized.sh $(ncurses_include_dir)/Caps > $@

include/ncurses/hashsize.h: $(ncurses_include_dir)/MKhashsize.sh
	@$(MSG_GENERATE)$@
	$(VERBOSE)AWK=mawk sh $< $(ncurses_include_dir)/Caps > $@

include/ncurses/keys.list:
	@$(MSG_GENERATE)$@
	$(VERBOSE)AWK=mawk sh $(ncurses_src_dir)/tinfo/MKkeys_list.sh $(ncurses_include_dir)/Caps | sort > $@

include/ncurses/init_keytry.h: src/lib/ncurses/make_keys include/ncurses/keys.list
	@$(MSG_GENERATE)$@
	$(VERBOSE)src/lib/ncurses/make_keys include/ncurses/keys.list > $@

include/ncurses/term.h: include/ncurses/MKterm.h.awk
	@$(MSG_GENERATE)$@
	$(VERBOSE)mawk -f $< $(ncurses_include_dir)/Caps > $@

include/ncurses/MKterm.h.awk: $(ncurses_include_dir)/MKterm.h.awk.in
	@$(MSG_GENERATE)$@
	$(VERBOSE)cp $< $@
	$(call apply_substitutions,$@)

include/ncurses/ncurses_dll.h: $(ncurses_include_dir)/ncurses_dll.h.in
	@$(MSG_GENERATE)$@
	$(VERBOSE)cp $< $@
	$(call apply_substitutions,$@)

include/ncurses/termcap.h: $(ncurses_include_dir)/termcap.h.in
	@$(MSG_GENERATE)$@
	$(VERBOSE)cp $< $@
	$(call apply_substitutions,$@)

include/ncurses/unctrl.h: $(ncurses_include_dir)/unctrl.h.in
	@$(MSG_GENERATE)$@
	$(VERBOSE)cp $< $@
	$(call apply_substitutions,$@)

src/lib/ncurses/names.c:
	@$(MSG_GENERATE)$@
	$(VERBOSE)mawk -f $(ncurses_src_dir)/tinfo/MKnames.awk bigstrings=1 $(ncurses_include_dir)/Caps > $@

src/lib/ncurses/codes.c:
	@$(MSG_GENERATE)$@
	$(VERBOSE)mawk -f $(ncurses_src_dir)/tinfo/MKcodes.awk bigstrings=1 $(ncurses_include_dir)/Caps > $@

src/lib/ncurses/fallback.c: $(ncurses_src_dir)/tinfo/MKfallback.sh
	@$(MSG_GENERATE)$@
	$(VERBOSE)sh -e $< x src/lib/ncurses/misc/terminfo.src tic linux vt102 > $@ 2> /dev/null
	$(VERBOSE)#sh -e $< /usr/share/terminfo $(ncurses_src_dir)/misc/terminfo.src /usr/bin/tic > $@

src/lib/ncurses/unctrl.c:
	@$(MSG_GENERATE)$@
	$(VERBOSE)echo | mawk -f $(ncurses_src_dir)/base/MKunctrl.awk bigstrings=1 > $@

src/lib/ncurses/comp_captab.c: src/lib/ncurses/make_hash
	@$(MSG_GENERATE)$@
	$(VERBOSE)cd $(dir $@);\
	          sh -e $(realpath $(ncurses_src_dir))/tinfo/MKcaptab.sh \
	          mawk 1 $(realpath $(ncurses_src_dir))/tinfo/MKcaptab.awk \
	          $(realpath $(ncurses_include_dir))/Caps |\
	          sed 's/^\(.*generated by\).*\(MKcaptab.sh.*\)/\1 \2/' > $(notdir $@)

src/lib/ncurses/make_keys: $(ncurses_src_dir)/tinfo/make_keys.c
	@$(MSG_GENERATE)$@
	$(VERBOSE)$(CC) -o $@ -DHAVE_CONFIG_H -I$(REP_DIR)/include/ncurses \
	                -Iinclude/ncurses -Isrc/lib/ncurses -I$(ncurses_src_dir) $<

src/lib/ncurses/make_hash: $(ncurses_src_dir)/tinfo/make_hash.c
	@$(MSG_GENERATE)$@
	$(VERBOSE)$(CC) -o $@ -DHAVE_CONFIG_H -I$(REP_DIR)/include/ncurses \
	                -Iinclude/ncurses -Isrc/lib/ncurses -I$(ncurses_src_dir) $<

src/lib/ncurses/make_keys: src/lib/ncurses/names.c
