# Makefile.in for the winsup/mingw directory.
# Copyright (c) 1995, 1996, 1997, 1998 Cygnus Solutions

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This makefile requires GNU make.

PACKAGE = mingw-runtime
VERSION = 3.6
CYGRELEASE = 1

VPATH = @srcdir@
srcdir = @srcdir@
objdir = .

host_alias = @host_alias@
build_alias = @build_alias@
target_alias = @target_alias@
prefix = @prefix@
conf_prefix = @prefix@

program_transform_name = @program_transform_name@
exec_prefix = @exec_prefix@
bindir = @bindir@
libdir = @libdir@
ifeq ($(target_alias),$(host_alias))
ifeq ($(build_alias),$(host_alias))
tooldir:=$(exec_prefix)
else
tooldir:=$(exec_prefix)/$(target_alias)
endif
else
tooldir:=$(exec_prefix)/$(target_alias)
endif
datadir = @datadir@
infodir = @infodir@
includedir = @includedir@
ifneq (,$(findstring cygwin,$(target_alias)))
inst_bindir:=$(tooldir)/bin
inst_includedir:=$(tooldir)/include/mingw
inst_libdir:=$(tooldir)/lib/mingw
inst_docdir:=$(tooldir)/share/doc/mingw-runtime
else
inst_bindir:=$(bindir)
inst_includedir:=$(includedir)
inst_libdir:=$(libdir)
inst_docdir:=$(prefix)/doc/mingw-runtime
endif

# The Mingw headers are installed under a subdirectory of 
# $(tooldir)/include when configuring in Cygwin.
HEADER_SUBDIR = @HEADER_SUBDIR@

SHELL = /bin/sh

INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
mkinstalldirs = $(SHELL) @MKINSTALLDIRS@

CC := @CC@
override CC := ${filter-out -L% -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\)  *[^ ]*\( \|$$\)% %g'}}
# FIXME: Which is it, CC or CC_FOR_TARGET?
CC_FOR_TARGET = $(CC)
AS_FOR_TARGET = $(AS)
CFLAGS = @CFLAGS@
CXXFLAGS = @CXXFLAGS@

# compiling with Cygwin?
MNO_CYGWIN = @MNO_CYGWIN@
ifdef MNO_CYGWIN
   subdirforlib=/mingw
else
   libdir=
endif

# Either crtdll (CRT_ID 1) or msvcrt (CRT_ID 2).
RUNTIME = @RUNTIME@
CRT_ID = @CRT_ID@

# Needed for threading dll.
THREAD_DLL = @THREAD_DLL@
THREAD_DLL_VERSION = 10
THREAD_DLL_NAME = $(THREAD_DLL)$(THREAD_DLL_VERSION).dll

# Various libraries.
LIBM_A=@LIBM_A@

W32API_INCLUDE = @W32API_INCLUDE@
INCLUDES+= -I$(srcdir)/include \
  -I$(srcdir)/../include \
  -nostdinc \
  -iwithprefixbefore include
ALL_CFLAGS = $(CFLAGS) $(W32API_INCLUDE) $(INCLUDES) $(MNO_CYGWIN)
ALL_CXXFLAGS = $(CXXFLAGS) $(W32API_INCLUDE) $(INCLUDES) -nostdinc++ $(MNO_CYGWIN)

AS = @AS@
AR = @AR@
LD = @LD@
AR_FLAGS = rcv
RANLIB = @RANLIB@
DLLTOOL = @DLLTOOL@
DLLTOOLFLAGS = 
DLLTOOL_FOR_TARGET = $(DLLTOOL)
DLLTOOL_FLAGS = --as $(AS_FOR_TARGET)
DLLWRAP = @DLLWRAP@
DLLWRAP_FOR_TARGET = $(DLLWRAP)
DLLWRAP_FLAGS = --dlltool $(DLLTOOL) --as $(AS) --driver-name $(CC)

TAR = tar
TARFLAGS = z
TARFILEEXT = .tar.gz

SUBDIRS := @SUBDIRS@

FLAGS_TO_PASS:=\
	AS="$(AS)" \
	CC="$(CC)" \
	CFLAGS="$(CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_CONFIG)" \
	CXXFLAGS="$(CXXFLAGS) $(CFLAGS_COMMON) $(CFLAGS_CONFIG)" \
	EXE_LDFLAGS="$(EXE_LDFLAGS)" \
	AR="$(AR)" \
	RANLIB="$(RANLIB)" \
	LD="$(LD)" \
	DLLTOOL="$(DLLTOOL)" \
	exec_prefix="$(exec_prefix)" \
	bindir="$(bindir)" \
	libdir="$(libdir)" \
	tooldir="$(tooldir)" \
	datadir="$(datadir)" \
	infodir="$(infodir)" \
	includedir="$(includedir)" \
	inst_bindir="$(inst_bindir)" \
	inst_includedir="$(inst_includedir)" \
	inst_libdir="$(inst_libdir)" \
	inst_docdir="$(inst_docdir)" \
	prefix="$(prefix)" \
	target_alias="$(target_alias)" \
	TAR="$(TAR)" \
	TARFLAGS="$(TARFLAGS)" \
	TARFILEEXT="$(TARFILEEXT)"

CRT0S = crt1.o dllcrt1.o crt2.o dllcrt2.o CRT_noglob.o crtmt.o crtst.o \
	CRT_fp8.o CRT_fp10.o txtmode.o binmode.o
MINGW_OBJS = CRTglob.o CRTfmode.o CRTinit.o  dllmain.o gccmain.o \
	     main.o crtst.o mthr_stub.o CRT_fp10.o txtmode.o \
	     pseudo-reloc.o pseudo-reloc-list.o

MOLD_OBJS = isascii.o iscsym.o iscsymf.o toascii.o \
	strcasecmp.o strncasecmp.o wcscmpi.o

LIBS = libcrtdll.a \
       libmsvcrt.a libmsvcrtd.a \
       libmsvcr70.a libmsvcr70d.a \
       libmsvcr71.a libmsvcr71d.a \
       libmingw32.a \
       libcoldname.a \
       libmoldname.a libmoldnamed.a \
       $(LIBM_A) \
       libmingwthrd.a

DLLS = $(THREAD_DLL_NAME)

INSTDOCS = CONTRIBUTORS \
	   DISCLAIMER \
	   README

SRCDIST_FILES = CRT_noglob.c CRTfmode.c CRTglob.c CRTinit.c ChangeLog \
Makefile.in README TODO config.guess config.sub configure configure.in \
crt1.c crtdll.def crtmt.c crtst.c  dllcrt1.c dllmain.c \
gccmain.c init.c install-sh jamfile main.c mkinstalldirs \
moldname.def.in msvcrt.def.in \
mthr.c mthr_init.c mthr_stub.c readme.txt \
isascii.c iscsym.c iscsymf.c toascii.c \
strcasecmp.c strncasecmp.c wcscmpi.c \
CRT_fp8.c CRT_fp10.c test_headers.c txtmode.c binmode.c pseudo-reloc.c \
pseudo-reloc-list.c \
DISCLAIMER CONTRIBUTORS


all_dlls_host = @all_dlls_host@
install_dlls_host = @install_dlls_host@

all: $(CRT0S) $(LIBS) $(all_dlls_host)
	@$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)

all_dlls_host: $(DLLS)

install_dlls_host:
	for i in $(DLLS); do \
		$(INSTALL_PROGRAM) $$i $(inst_bindir)/$$i ; \
	done

_libm_dummy.o:
	rm -f _libm_dummy.c
	echo "static int __mingw_libm_dummy;" > _libm_dummy.c
	$(CC) -c $(ALL_CFLAGS) _libm_dummy.c
	rm -f _libm_dummy.c

libm.a: _libm_dummy.o
	$(AR) rc $@ _libm_dummy.o
	$(RANLIB) $@

libmingwthrd.a: crtmt.o mingwthrd.def 
	$(DLLTOOL) $(DLLTOOL_FLAGS) --dllname $(THREAD_DLL_NAME) \
	  --def mingwthrd.def --output-lib $@
	$(AR) $(ARFLAGS) $@ crtmt.o
	$(RANLIB) $@

# Using dllwrap would be so much easier, but Cygnus top-level configure
# Makefile.in etc don't pass the right variables yet.
xx_$(THREAD_DLL_NAME) xx_mingwthrd.def: mthr.o mthr_init.o
	$(DLLWRAP) $(DLLWRAP_FLAGS) -o $(THREAD_DLL_NAME) \
		--output-def mingwthrd.def \
		mthr.o mthr_init.o

DLL_OFILES        = mthr.o mthr_init.o
DLL_CC_STUFF      = -B./ -mdll $(MNO_CYGWIN) -Wl,--image-base,0x6FBC0000 \
		    -Wl,--entry,_DllMainCRTStartup@12 \
                    $(DLL_OFILES) \
		    -Lmingwex
DLL_DLLTOOL_STUFF = --as=$(AS) --dllname $(THREAD_DLL_NAME) \
                    --def mingwthrd.def \
                    --base-file mingwthrd.base --output-exp mingwthrd.exp

$(THREAD_DLL_NAME) mingwthrd.def: $(DLL_OFILES) Makefile $(SUBDIRS)
	$(DLLTOOL) --as $(AS) --output-def mingwthrd.def $(DLL_OFILES)
	$(CC) -Wl,--base-file=mingwthrd.base $(DLL_CC_STUFF) \
		-o mingwthrd_dummy.exe
	$(DLLTOOL) $(DLL_DLLTOOL_STUFF)
	$(CC) -Wl,--base-file=mingwthrd.base mingwthrd.exp $(DLL_CC_STUFF) \
		-o mingwthrd_dummy.exe
	$(DLLTOOL) $(DLL_DLLTOOL_STUFF) 
	$(CC) mingwthrd.exp -o $(THREAD_DLL_NAME) $(DLL_CC_STUFF)
	rm -f mingwthrd_dummy.exe

libmingw32.a: $(MINGW_OBJS)
	$(AR) rc $@ $(MINGW_OBJS)
	$(RANLIB) $@

msvcrt.def msvcrtd.def \
msvcr70.def msvcr70d.def \
msvcr71.def msvcr71d.def \
: msvcrt.def.in
	$(CC) -DRUNTIME=$(basename $(notdir $@)) \
		-D__$(basename $(notdir $@))__=1 \
		-D__MSVCRT__ -C -E -P \
		-xc-header $? > $@

moldname-crtdll.def: moldname.def.in
	$(CC) -DRUNTIME=crtdll \
		-D__FILENAME__=moldname-crtdll.def \
		-D__CRTDLL__  -C -E -P \
		-xc-header $? > $@

moldname-msvcrt.def: moldname.def.in
	$(CC) -DRUNTIME=msvcrt \
		-D__FILENAME__=moldname-msvcrt.def \
		-D__MSVCRT__  -C -E -P \
		-xc-header $? > $@

libcoldname.a: moldname-crtdll.def $(MOLD_OBJS)
	$(DLLTOOL) --as $(AS) -k -U	\
		--dllname crtdll.dll	\
		--def moldname-crtdll.def	\
		--output-lib $@
	$(AR) rc $@ $(MOLD_OBJS)
	$(RANLIB) $@

libmoldname.a: moldname-msvcrt.def $(MOLD_OBJS)
	$(DLLTOOL) --as $(AS) -k -U	\
		--dllname msvcrt.dll	\
		--def moldname-msvcrt.def	\
		--output-lib $@
	$(AR) rc $@ $(MOLD_OBJS)
	$(RANLIB) $@

libmoldnamed.a: moldname-msvcrt.def $(MOLD_OBJS)
	$(DLLTOOL) --as $(AS) -k -U	\
		--dllname msvcrtd.dll	\
		--def moldname-msvcrt.def	\
		--output-lib $@
	$(AR) rc $@ $(MOLD_OBJS)
	$(RANLIB) $@

# The special rules are necessary.
crt1.o dllcrt1.o:
	$(CC) -c -D__CRTDLL__ -U__MSVCRT__ $(ALL_CFLAGS) $< -o $@

crt2.o dllcrt2.o:
	$(CC) -c -D__MSVCRT__ -U__CRTDLL__ $(ALL_CFLAGS) $< -o $@

TEST_H_OPTIONS = $(ALL_CFLAGS) -Wall -W -Wsystem-headers -c \
	$(srcdir)/test_headers.c -o test_headers.o

.PHONY: test_headers
test_headers:
	@echo "Testing runtime headers..."
	@for lang in c c++ objective-c ; do \
		echo "$$lang ..."; \
		$(CC) -x$$lang  $(TEST_H_OPTIONS) ; \
		echo "$$lang -ansi"; \
		$(CC) -x$$lang -ansi $(TEST_H_OPTIONS) ; \
	done
# specify -std=xx only for C
	@for std in gnu89 gnu99 c89 c99 ; do \
		echo "std = $$std"; \
		$(CC) -std=$$std  $(TEST_H_OPTIONS) ; \
	done

	@rm -f test_headers.o

clean:
	-rm -f *.o *.a *~ core a.out mingwthrd.def mingwthrd.base mingwthrd.exp
	-rm -f $(THREAD_DLL_NAME) mingwthrd_dummy.exe
	-rm -f moldname-*.def
	@$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)

distclean: clean
	@$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)
	-rm -f config.cache config.status config.log 
	-rm -f Makefile

ifdef SNAPDATE
      distdir=$(PACKAGE)-$(VERSION)-$(SNAPDATE)
else
   ifneq (,$(findstring cygwin, $(target_alias)))
      distdir=$(PACKAGE)-$(VERSION)-$(CYGRELEASE)
   else
      distdir=$(PACKAGE)-$(VERSION)
   endif
endif

ifneq (,$(findstring cygwin, $(target_alias)))
  TARFLAGS = j
  TARFILEEXT = .tar.bz2
endif

ifneq (,$(findstring mingw, $(target_alias)))
    dist_prefix =
else
    dist_prefix = $(conf_prefix)
endif

dist: srcdist bindist

srcdist:
	rm -rf $(distdir)
	mkdir $(distdir)
	chmod 755 $(distdir)
	for i in $(SRCDIST_FILES); do \
		cp -p $(srcdir)/$$i $(distdir)/$$i ; \
	done
	for i in $(SUBDIRS); do \
		(cd $$i; $(MAKE) distdir=../$(distdir) dist); \
	done
#FIXME this needs to be done with SUBDIRS and Makefiles.
	mkdir $(distdir)/include
	mkdir $(distdir)/include/sys
	cp $(srcdir)/include/*.h $(distdir)/include/
	cp $(srcdir)/include/sys/*.h $(distdir)/include/sys/
#end FIXME
	rm -f $(distdir)-src.tar.gz
	$(TAR) $(TARFLAGS)cf $(distdir)-src$(TARFILEEXT) $(distdir)


bindist:
	rm -rf $(distdir)
	mkdir $(distdir)
	chmod 755 $(distdir)
	$(MAKE) install prefix=$(shell pwd)/$(distdir)$(dist_prefix)
	rm -f $(distdir).tar.gz
	cd $(distdir); \
	$(TAR) $(TARFLAGS)cf ../$(distdir)$(TARFILEEXT) *

snapshot: 
	make dist SNAPDATE=$(shell date '+%Y%m%d')

info:

info-html:

install-info: info

install-dirs:
	$(mkinstalldirs) $(inst_bindir)
	$(mkinstalldirs) $(inst_includedir)
	$(mkinstalldirs) $(inst_libdir)
	$(mkinstalldirs) $(inst_docdir)

install: all install-dirs $(install_dlls_host)
	for i in $(LIBS); do \
		$(INSTALL_DATA) $$i $(inst_libdir)/$$i ; \
	done
	for i in $(CRT0S); do \
		$(INSTALL_DATA) $$i $(inst_libdir)/$$i ; \
	done
	for i in $(INSTDOCS); do \
		$(INSTALL_DATA) $(srcdir)/$$i $(inst_docdir)/$$i ; \
	done
	for sub in . sys ; do \
		dstdir=$(inst_includedir)/$$sub ; \
		$(mkinstalldirs) $$dstdir ; \
		for i in $(srcdir)/include/$$sub/*.h ; do \
		  $(INSTALL_DATA) $$i $$dstdir/`basename $$i` ; \
		done ; \
	done
	@$(MAKE) subdirs DO=$@ $(FLAGS_TO_PASS)

subdirs: $(SUBDIRS)
	@true

# The . is here because SUBDIRS may be empty

. $(SUBDIRS): force
	@if [ -d ./$@ ]; then \
	  echo "Making $(DO) in $@..." ; \
	  if (rootme=`pwd`/ ; export rootme ; \
	    rootsrc=`cd $(srcdir); pwd`/ ; export rootsrc ; \
	    cd ./$@; \
	    $(MAKE) $(FLAGS_TO_PASS) $(DO)) ; then true ; \
	  else exit 1 ; fi ; \
	else true ; fi ; \

force:

#
# Dependancies
#
libcrtdll.a: crtdll.def
libmsvcrt.a: msvcrt.def
libmsvcrtd.a: msvcrtd.def
CRT_noglob.o: CRT_noglob.c
CRTfmode.o: CRTfmode.c
CRTglob.o: CRTglob.c
CRTinit.o: CRTinit.c
crt1.o: crt1.c init.c
crt2.o: crt1.c init.c
crtmt.o: crtmt.c
crtst.o: crtst.c
ctype_old.o: ctype_old.c
dllcrt1.o: dllcrt1.c 
dllcrt2.o: dllcrt1.c 
dllmain.o: dllmain.c
main.o: main.c
oldnames.o: oldnames.c
string_old.o: string_old.c
CRT_fp8.o: CRT_fp8.c
CRT_fp10.o: CRT_fp10.c


Makefile: Makefile.in config.status configure
	$(SHELL) config.status

config.status: configure
	$(SHELL) config.status --recheck

.SUFFIXES: .y $(SUFFIXES) .cc .def .a

lib%.a:%.def
	$(DLLTOOL) --as=$(AS) -k --dllname $*.dll --output-lib lib$*.a --def $<

.c.o:
	$(CC) -c $(ALL_CFLAGS) $< -o $@