################################################################################
# Wrapper Makefile for ncurses library under OS/2.
################################################################################
# $Id: Makefile.os2,v 1.8 1998/12/13 02:23:13 tom Exp $
#
# Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.
# Webpage: http://www.arrakis.es/~worm/
################################################################################
#
# Notes (from I Zakharevich)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~
# I could build the library with the following sequence of commands:
#
#   touch Makefile
#   make -f Makefile.os2 config
#   make -f Makefile.os2 CC=gcc HOSTCC=gcc
#   make -f Makefile.os2 CC=gcc HOSTCC=gcc
#
# Ignoring the following errors:
#   Invalid configuration `os2'...
#   ... ac_maketemp="make": not found
#   ... syntax error: `done' unexpected
#   No rule to make target `lib/ncurses4.dll'
#
# You may need to run
#
#   rm make.defs
#   make -f Makefile.os2 make.defs
#
# if the build of misc/panel.def fails.
#
# If you do not have perl, the configuration will fail.  Use autoconf to
# generate the EMX-specific configure script (see README.emx), and run the
# configure script to generate the makefiles.  Then, run
#
#   make -f Makefile.os2 make.dlls
#
# Notes (from J J G Ripoll)
# ~~~~~~~~~~~~~~~~~~~~~~~~~
# The `make.defs' rule creates the new '.def' files and outputs a diagnostic
# about symbols that disappear from one release to the other, as well as
# checks about the new '.def' consistency.  If there were no problems, the
# maintainer is free to replace the `.ref' files with the newer ones using the
# `save.defs' rule.  So, the only tough work is ensuring that the symbols that
# disappear are not essential.
#
# I first thought about killing '_nc_*' symbols, but it seems that some of
# them --_nc_panel_hook, _nc_ada*, etc-- are needed outside ncurses.dll. 
# However, the whole size of the export table will not be larger than 1k or
# so.
#
# [installation]
#
# The way things are handled in misc/Makefile is not well suited for OS/2,
# where only emx.src is needed.  Thus, I've written a few wrapper rules in
# Makefile.os2 that handle installation/deinstallation.
#
# [distribution]
#
# There's also a new rule that configures and builds a sort of binary
# distribution, much like the one I prepared for 1.9.9e.  It's `os2dist'.
#
################################################################################

all :: config

# This is for configuring

# What is a useful value for this?
CONFIG_OPTS	= --enable-termcap
WWWGET		= lynx -source
MV_F		= mv -f
DLL_LN_OPTS	= -Zcrtdll -Zdll -Zomf -Zmt

config: config.cache

config.cache: configure.cmd configure
	-$(MV_F) $@ $@.ref
	configure.cmd $(CONFIG_OPTS)

configure.cmd: configure convert_configure.pl
	perl convert_configure.pl configure > $@

convert_configure.pl:
	$(WWWGET) ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/$@ > $@

install ::
	echo ***
	echo *** Do not use this command. Use install.os2 instead.
	echo ***
	exit 2

install.os2 : install.emxdata install.libs install.progs

include ./Makefile

all :: make.dlls

#
# DLLs and that stuff
#

LIBRARIES = ncurses form menu panel

DLL_TAG = $(NCURSES_MAJOR)
LIB_TAG = _s

DLL_ROOTS = $(addsuffix $(DLL_TAG), $(LIBRARIES))
DLLS = $(addsuffix .dll, $(addprefix ./lib/, $(DLL_ROOTS)))

LIB_ROOTS = $(addsuffix $(LIB_TAG), $(LIBRARIES))
LIBS = $(addsuffix .lib, $(addprefix ./lib/, $(LIB_ROOTS)))

LIBS_AOUT = $(addsuffix .a, $(addprefix ./lib/, $(LIB_ROOTS)))

DEFS = $(addsuffix .def, $(addprefix ./misc/, $(LIBRARIES)))

DLL_SIGNATURE = NCurses-$(NCURSES_MAJOR)-$(NCURSES_MINOR)-$(NCURSES_PATCH)

./lib/%$(LIB_TAG).lib : ./misc/%.def
	emximp -o $@ $<

./lib/%$(LIB_TAG).a : ./misc/%.def
	emximp -o $@ $<

./lib/%$(DLL_TAG).dll : ./lib/%.a
	emxomf -o ./lib/$*$(DLL_TAG).lib $<
	if [ "$*" = "ncurses" ]; then \
		gcc $(LDFLAGS) $(DLL_LN_OPTS) ./lib/$*$(DLL_TAG).lib \
				./misc/$*.def -o $@; \
	else \
		gcc $(LDFLAGS) $(DLL_LN_OPTS) ./lib/$*$(DLL_TAG).lib \
				./lib/ncurses$(LIB_TAG).lib ./misc/$*.def -o $@; \
	fi
	-rm -f ./lib/$*$(DLL_TAG).lib

make.dlls : $(DEFS) $(LIBS) $(DLLS) $(LIBS_AOUT)

$(DEFS) : make.defs

LIBDIR	= $(INSTALL_PREFIX)$(libdir)
$(LIBDIR) :
	mkdir -p $@

install.libs :: $(LIBS) $(DLLS) $(LIBDIR)
	@for i in $(DLL_ROOTS); do \
	echo installing ./lib/$$i.dll as $(LIBDIR)/$$i.dll; \
	$(INSTALL_DATA) ./lib/$$i.dll $(LIBDIR)/$$i.dll; done
	@for i in $(LIB_ROOTS); do \
	echo installing ./lib/$$i.lib as $(LIBDIR)/$$i.lib; \
	$(INSTALL_DATA) ./lib/$$i.lib $(LIBDIR)/$$i.lib; done

uninstall.libs ::
	-@for i in $(DLL_ROOTS); do \
	echo uninstalling $(LIBDIR)/$$i.dll; \
	rm -f $(LIBDIR)/$$i.dll; done
	-@for i in $(LIB_ROOTS); do \
	echo uninstalling $(LIBDIR)/$$i.lib; \
	rm -f $(LIBDIR)/$$i.lib; done

make.defs :
	for i in $(LIBRARIES); do \
	echo LIBRARY $${i}$(DLL_TAG) INITINSTANCE TERMINSTANCE > ./misc/$$i.def; \
	echo DESCRIPTION \"$(DLL_SIGNATURE), module $$i\" >> ./misc/$$i.def; \
	echo CODE LOADONCALL >> ./misc/$$i.def; \
	echo DATA LOADONCALL NONSHARED MULTIPLE >> ./misc/$$i.def; \
	echo EXPORTS >> ./misc/$$i.def; \
	echo Creating $$i.def; \
	(cmd /C ".\\misc\\makedef.cmd ./lib/$$i.a ./misc/$$i.ref >> ./misc/$$i.def" \
	 && cmd /C ".\\misc\\chkdef.cmd ./misc/$$i.def") \
	|| exit 1; \
	done
	touch make.defs

save.defs :
	for i in $(LIBRARIES); do \
	test -f ./misc/$$i.def && cp ./misc/$$i.def ./misc/$$i.ref; \
	done

clean \
os2clean ::
	-rm -f $(DLLS) $(LIBS)

realclean ::
	-rm -f $(addprefix ./misc/, $(addsuffix .def, $(LIBRARIES)))

#
# This is a simplified version of misc/Makefile
#

TICDIR = $(INSTALL_PREFIX)$(datadir)/terminfo
TABSETDIR = $(INSTALL_PREFIX)$(datadir)/tabset

$(TICDIR) :
	mkdir -p $@

install \
install.emxdata :: $(TICDIR)
	-@rm -fr $(TICDIR)/*
	echo Building terminfo database, please wait...
	set TERMINFO=$(TICDIR); ./progs/tic ./misc/emx.src
	echo Installing the terminfo cleaner and the sources...
	cp ./misc/emx.src ./misc/cleantic.cmd $(TICDIR)
	./misc/cleantic.cmd $(TICDIR)

uninstall \
uninstall.emxdata ::
	-cd $(TICDIR) && rm -rf *
	-cd $(TABSETDIR) && rm -rf *

#
# This is for preparing binary distributions
#

OS2NAME=ncurses-$(NCURSES_MAJOR).$(NCURSES_MINOR)-emx

#
# FIXME: this assumes that we can rerun the configure script, changing only
# the install-prefix.  That means we cannot provide "interesting" options
# when building.
#
os2dist :
	$(MAKE) -f Makefile.os2 os2clean
	./configure --without-debug --with-install-prefix=`pwd|sed -e 's@^.:@@'`/$(OS2NAME)
	$(MAKE) -f Makefile.os2 $(CF_MFLAGS) install.os2
	-rm -f $(OS2NAME).zip
	echo NCurses-$(NCURSES_MAJOR).$(NCURSES_MINOR)-$(NCURSES_PATCH) for emx > $(OS2NAME)/FILE_ID.DIZ
	echo Binary release. >> $(OS2NAME)/FILE_ID.DIZ
	zip -r $(OS2NAME).zip ./$(OS2NAME)

clean \
os2clean ::
	-rm -rf $(OS2NAME)
	-rm -f $(OS2NAME).zip

