# Makefile.in for windows stuff
#
# This file is part of Cygwin.
#
# This software is a copyrighted work licensed under the terms of the
# Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
# details.

# This makefile requires GNU make.

SHELL:=@SHELL@
VPATH:=@srcdir@
srcdir:=@srcdir@
objdir:=.

target_alias:=@target_alias@
build_alias:=@build_alias@
host_alias:=@host_alias@
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
datarootdir:=@datarootdir@
datadir:=@datadir@
infodir:=@infodir@
includedir:=@includedir@

INSTALL:=@INSTALL@
INSTALL_PROGRAM:=@INSTALL_PROGRAM@
INSTALL_DATA:=@INSTALL_DATA@

SUBDIRS=@subdirs@
INSTALL_SUBDIRS=${patsubst %,install_%,$(SUBDIRS)}
CLEAN_SUBDIRS=${patsubst %,clean_%,$(SUBDIRS)}

INSTALL_LICENSE:=@INSTALL_LICENSE@

.PHONY: all install clean distclean all-info info install-info install-license check \
	$(SUBDIRS) $(INSTALL_SUBDIRS) $(CLEAN_SUBDIRS)

.SUFFIXES:

MAKEOVERRIDES_WORKAROUND=${wordlist 2,1,a b c}

ifneq ($(MAKEOVERRIDES_WORKAROUND),)
    override MAKE:=$(MAKE) $(MAKEOVERRIDES)
    MAKEOVERRIDES:=
    export MAKEOVERRIDES
endif

all: Makefile $(SUBDIRS)

install-license: CYGWIN_LICENSE COPYING
	${INSTALL} -d $(DESTDIR)$(prefix)/share/doc/Cygwin
	for i in $^; do \
	  ${INSTALL} $$i $(DESTDIR)$(prefix)/share/doc/Cygwin ; \
	done

install: Makefile $(INSTALL_LICENSE) $(INSTALL_SUBDIRS)

clean distclean: $(CLEAN_SUBDIRS)

all-info:

install-info:

info:

$(SUBDIRS):
	@${MAKE} -C $@ all || ([ "$@" == doc ] && echo "*** error ignored")

$(INSTALL_SUBDIRS):
	@${MAKE} -C $(patsubst install_%,%,$@) install || ([ "$@" == install_doc ] && echo "*** error ignored")

$(CLEAN_SUBDIRS):
	@if cd $(patsubst clean_%,%,$@) 2>/dev/null; then \
	    $(MAKE) clean || exit 1; \
	fi || exit 0

.PRECIOUS: Makefile

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

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

# The below rule is intended to run configure only when "make check" is
# actually specified, i.e., not in a cross-compilation environment.  The
# cygwin configuration is copied and modified to ensure that the same configuration
# parameters are passed when the testsuite is configured as when cygwin was configured.
check: cygwin
	@if [ -f testsuite/config.status ]; then \
	    cd testsuite; \
	else \
	    (mkdir testsuite 2>/dev/null || exit 0); \
	    cd testsuite; \
	    sed -e 's%winsup/cygwin\>%winsup/testsuite%g' ../cygwin/config.status > config.status; \
	    chmod a+x config.status; \
	    sh ./config.status --recheck; \
	    sh ./config.status; \
	fi; \
	$(MAKE) check

utils: cygwin

cygwin:

cygserver: cygwin

install_utils: cygwin

install_cygwin:

install_cygserver: cygwin

lsaauth:
