# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
# This file is part of the GNU C Library.

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.

# The GNU C Library 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
# Library General Public License for more details.

# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB.  If not,
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

dist:

# Make the value empty so ifdef fails if it's $(-subdir).
subdir := $(subdir)
ifdef subdir
.. := ../
else
.. :=
endif

include $(..)Makeconfig

foo:=$(shell echo 'distribute=$(distribute)'>&2)
foo:=$(shell echo 'dont_distribute=$(dont_distribute)'>&2)
foo:=$(shell echo 'foobar=$(filter %.c %.S %.s %.h,$(distribute))'>&2)

ifndef sysdep_dirs
# Find all sysdep directories.
export sysdep_dirs := $(shell find $(..)sysdeps -type d \
				   ! -name CVS ! -name RCS -print)
else
# Defined by the parent.
sysdep_dirs := $(addprefix $(..),$(sysdep_dirs))
endif

# Don't distribute add-on subdirs.
subdirs := $(filter-out $(add-ons),$(subdirs))

# Make sure both stdio and libio get in, whichever is in use.
subdirs += stdio libio

sysdep-Subdir-files := $(wildcard $(addsuffix /Subdirs,$(sysdep_dirs)))
ifdef sysdep-Subdir-files
subdirs := $(sort $(subdirs) \
		  $(shell sed -e 's/\#.*$$//' $(sysdep-Subdir-files)))
endif


# Makefiles can define `source_dirs' to list nonstandard directories
# where source files might be found.

ifdef	subdir
all-headers = $(filter-out $(sysdep_headers),$(headers))
else
+distinfo := $(shell MAKEFLAGS= MFLAGS= $(MAKE) -s no_deps=t \
		     inhibit_interface_rules=t inhibit_mach_syscalls=t \
		     subdirs='$(subdirs)' echo-distinfo | grep -v '^make')
foo:=$(shell echo>&2 '+distinfo=$(+distinfo)')
all-headers := $(patsubst +header+%,%,$(filter +header+%,$(+distinfo)))
# Ignore subdir headers without top-level indirections.
all-headers := $(sort $(headers) $(wildcard $(all-headers)))
+subdir-nodist := $(patsubst +nodist+%,%,$(filter +nodist+%,$(+distinfo)))
+subdir-headers := $(filter-out $(headers),$(all-headers))
endif
foo:=$(shell echo 'IS THIS WORKING??? all-headers=$(all-headers)' >&2)

sources += $(addsuffix .c,$(elided-routines) \
		          $(foreach l,$(extra-libs),$($l-routines)))

# Find all sysdep sources and headers.
+maybe-sysdeps := $(sources) $(sources:.c=.s) $(sources:.c=.S) $(all-headers) \
		  $(filter %.c %.S %.s %.h %.sub,$(distribute))
foo:=$(shell echo '+maybe-sysdeps=$(+maybe-sysdeps)'>&2)
# Find all the files that have a stub or generic version.
try-sysdeps := $(foreach dir,$(..)sysdeps/stub $(..)sysdeps/generic \
			     $(..)sysdeps/libm-ieee754,\
			     $(addprefix $(dir)/,$(+maybe-sysdeps)))
foo:=$(shell echo 'try-sysdeps=$(try-sysdeps)'>&2)
+sysdeps := $(wildcard $(try-sysdeps))
foo:=$(shell echo 'stub/generic +sysdeps=$(+sysdeps)'>&2)
+sysdep-names := $(sort $(patsubst $(..)sysdeps/generic/%,%,\
				   $(patsubst $(..)sysdeps/stub/%,%,\
				   $(patsubst $(..)sysdeps/libm-ieee754/%,%,\
					      $(+sysdeps)))))
foo:=$(shell echo '+sysdep-names=$(+sysdep-names)' >&2)

ifdef subdir-dirs
vpath % $(subdir-dirs)
endif

# Now find all the sysdep versions of those files.
+sysdeps := $(foreach dir,$(sysdep_dirs) $(source_dirs),\
		      $(wildcard $(addprefix $(dir)/, \
					     $(+sysdep-names) \
					     $(+sysdep-names:.c=.s) \
					     $(+sysdep-names:.c=.S) \
				  )))


# Source and header files to go in the distribution tar file.

.S.s := $(wildcard $(sources:.c=.S) $(sources:.c=.s))
sources := $(filter-out $(addsuffix .c,$(basename $(.S.s))),$(sources)) $(.S.s)

+out := $(patsubst %.S,%.c,$(+sysdep-names:.s=.c)) \
	$(addsuffix .c,$(sysdep_routines)) \
	$(+subdir-nodist) $(dont_distribute)
foo:=$(shell echo '+out=$(+out)' >&2; echo foofoo >&2)
+tsrcs	:= $(filter-out $(+out), $(sources) $(all-headers) $(distribute)) \
	   $(+sysdeps)
foo:=$(shell echo 'made +tsrcs=$(+tsrcs)'>&2)
foo:=$(shell echo generated='$(generated)' >&2)
#generated := $(sort $(generated) $(generated:.S=.c) $(generated:.s=.c))
#foo:=$(shell echo now generated='$(generated)' >&2)
+tsrcs := $(sort $(filter-out $(generated),$(+tsrcs)))
foo:=$(shell echo '+tsrcs=$(+tsrcs)'>&2)
foo:=$(shell echo foobie, dammit! >&2)

ifndef tardir
-include $(common-objpfx)version.mk
export tardir := glibc-$(version)
endif

$(..)glibc-$(version):
	ln -s . $@

#+tsrcs := $(+tsrcs) \
#	  TAGS
.PHONY: TAGS
TAGS: $(..)MakeTAGS
	$(MAKE) -f $< $@ -o subdir_TAGS

ifdef	   subdir

foo:=$(shell echo subdir foo >&2)

+tsrcs := Makefile $(+tsrcs)					\
	  $(addsuffix .c,$(others) $(tests) $(test-srcs))	\
	  $(wildcard $(addsuffix .input,$(tests) $(test-srcs))	\
	  $(addsuffix .args,$(tests) $(test-srcs)))
+tardeps := $(strip $(+tsrcs))

verbose = v

.PHONY: dist
dist: $(..)$(tardir) $(+tardeps)
	@cd ..; if test -f dist.tar; then c=u; else c=c; fi;	\
	$(+cmdecho) "cd ..; tar $${c}h$(verbose)f dist.tar ...";	\
	tar $${c}h$(verbose)f dist.tar \
	    $(addprefix $(tardir)/$(subdir)/,$(filter-out $<,$^))

else	# Parent makefile.

# Find what other things sysdep directories want to distribute.

foo:=$(shell echo parent foobie>&2)
+sysdep-distfiles := $(wildcard $(addsuffix /Dist,$(sysdep_dirs)))
foo:=$(shell echo +sysdep-distfiles='$(+sysdep-distfiles)'>&2)
+sysdep-dist := $(foreach file,$(+sysdep-distfiles),\
			  $(addprefix $(dir $(file)), \
				      $(shell sed -e 's/\#.*$$//' $(file)))) \
		$(+sysdep-distfiles) \
		$(sysdep-Subdir-files)
foo:=$(shell echo '+sysdep-dist=$(+sysdep-dist)' >&2)

+sysdep-tsrcs := $(wildcard $(foreach file,Makefile Implies syscalls.list\
				           configure configure.in,\
				      $(addsuffix /$(file),$(sysdep_dirs)))) \
		 $(+sysdep-dist)

+tsrcs := $(+tsrcs) $(+sysdep-tsrcs)

define autoconf-it
autoconf $(ACFLAGS) $< > $@.new
mv -f $@.new $@
test ! -d CVS || cvs commit -m'Regenerated: autoconf $(ACFLAGS) $<' $@
endef

configure: configure.in aclocal.m4; $(autoconf-it)
%/configure: %/configure.in aclocal.m4; $(autoconf-it)

dist: $(tardir).tar.gz

subdir_dist: dist.tar
dist.tar: README $(tardir) $(+tsrcs)
	tar chvf $@ $(addprefix $(tardir)/,$(filter-out $(tardir),$^))

$(tardir).tar: dist.tar subdir_dist
	@echo Files listed here have names exceeding 14 chars.
	tar xfv $< -C $${TMPDIR-/tmp} | sed -n '/[^/]\{15,\}/p'
	tar covf $@ -C $${TMPDIR-/tmp} $(tardir)
	-rm -fr $${TMPDIR-/tmp}/$(tardir) dist.tar &

%.Z: %
	compress -c $< > $@

%.gz: %
	gzip -9 -v -c $< > $@

foo:=$(shell echo subdirs=$(subdirs) >&2)
dist-subdirs := $(addprefix dist-,$(subdirs)) # dist-manual
.PHONY: subdir_dist $(dist-subdirs)
subdir_dist: $(dist-subdirs)
$(dist-subdirs):
	$(MAKE) -C $(patsubst dist-%,%,$@) dist

# This is here instead of in Makefile so it can use $(release) and $(version).
README: README.template version.h
	-rm -f $@
	sed -e 's/RELEASE/$(release)/' -e 's/VERSION/$(version)/' < $< > $@
# Make it unwritable so I won't change it by mistake.
	chmod 444 $@
	test ! -d CVS || cvs commit -m'Remade for $(release)-$(version)' $@


endif	# Subdirectory vs. parent makefile

# Get these things out of the environment because they take up lots of space.
unexport distribute generated

# Fnord.
export inhibit_mach_syscalls=t
export no_deps=t
export inhibit_interface_rules=t
