# Copyright (C) 1991-2014 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 Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 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
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.

#
#	Rules for making a subdirectory in the GNU C library.
#	Each subdirectory Makefile defines some variables and includes this.
#
ifneq (,)
This makefile requires GNU Make.
endif

all: # Don't let the default goal come from Makeconfig.

include $(firstword $(..) ../)Makeconfig

ifndef	subdir
Each subdirectory makefile must define the `subdir' variable.
endif
# This ` unconfuses emacs.
# This is benign and useless in GNU make before 3.63.
export subdir := $(subdir)

# This is the default target; it makes the library and auxiliary programs.
.PHONY: all
all: objs lib others

ifeq ($(build-programs),yes)
others: $(addprefix $(objpfx),$(extra-objs) \
			      $(install-lib) \
			      $(install-bin) $(install-bin-script) \
			      $(install-rootsbin) $(install-sbin))
else
others: $(addprefix $(objpfx),$(extra-objs) \
			      $(install-lib))
endif

ifneq	"$(findstring env,$(origin headers))" ""
headers :=
endif

ifneq	"$(findstring env,$(origin generated))" ""
generated :=
endif

ifneq	"$(findstring env,$(origin common-generated))" ""
common-generated :=
endif

# See below.  This must be set before Makerules processes it.
before-compile += $(common-objpfx)bits/stdio_lim.h

include $(..)Makerules

.PHONY: subdir_lib
subdir_lib: lib-noranlib

# Some subdirs need to install a dummy library.
# They can use "$(objpfx)libfnord.a: $(dep-dummy-lib); $(make-dummy-lib)".
dep-dummy-lib = $(common-objpfx)dummy.o
define make-dummy-lib
$(AR) cr$(verbose) $@ $<
endef

$(common-objpfx)dummy.c:
	rm -f $@
	(echo 'extern void __dummy__ (void);'; \
	 echo 'void __dummy__ (void) { }') > $@
common-generated += dummy.o dummy.c

# This makes all the auxiliary and test programs.

.PHONY: others tests bench
ifeq ($(multi-arch),no)
tests := $(filter-out $(tests-ifunc), $(tests))
xtests := $(filter-out $(xtests-ifunc), $(xtests))
endif

ifeq ($(build-programs),yes)
others: $(addprefix $(objpfx),$(others) $(sysdep-others) $(extra-objs))
else
others: $(addprefix $(objpfx),$(extra-objs))
endif
ifeq ($(run-built-tests),no)
tests: $(addprefix $(objpfx),$(tests) $(test-srcs))
xtests: tests
else
tests: $(tests:%=$(objpfx)%.out)
xtests: tests $(xtests:%=$(objpfx)%.out)
endif

ifeq ($(build-programs),yes)
binaries-all-notests = $(others) $(sysdep-others)
binaries-all-tests = $(tests) $(xtests) $(test-srcs)
binaries-all = $(binaries-all-notests) $(binaries-all-tests)
binaries-static-notests = $(others-static)
binaries-static-tests = $(tests-static) $(xtests-static)
binaries-static = $(binaries-static-notests) $(binaries-static-tests)
ifeq (yesyes,$(have-fpie)$(build-shared))
binaries-pie-tests = $(tests-pie) $(xtests-pie)
binaries-pie-notests = $(others-pie)
else
binaries-pie-tests =
binaries-pie-notests =
endif
else
binaries-all-notests =
binaries-all-tests = $(tests) $(xtests) $(test-srcs)
binaries-all = $(binaries-all-tests)
binaries-static-notests =
binaries-static-tests =
binaries-static =
binaries-pie-tests =
binaries-pie-notests =
endif

binaries-pie = $(binaries-pie-tests) $(binaries-pie-notests)
binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \
				     $(binaries-all-tests))
binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \
				       $(binaries-all-notests))

ifneq "$(strip $(binaries-shared-notests))" ""
$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
	$(+link)
endif

ifneq "$(strip $(binaries-shared-tests))" ""
$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
	$(+link-tests)
endif

ifneq "$(strip $(binaries-pie-tests))" ""
$(addprefix $(objpfx),$(binaries-pie-tests)): %: %.o \
  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
	$(+link-pie-tests)
endif

ifneq "$(strip $(binaries-pie-notests))" ""
$(addprefix $(objpfx),$(binaries-pie-notests)): %: %.o \
  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
	$(+link-pie)
endif

ifneq "$(strip $(binaries-static-notests))" ""
$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
  $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
	$(+link-static)
endif

ifneq "$(strip $(binaries-static-tests))" ""
$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
  $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
	$(+link-static-tests)
endif

ifneq "$(strip $(tests) $(xtests) $(test-srcs))" ""
# These are the implicit rules for making test outputs
# from the test programs and whatever input files are present.

make-test-out = $(test-wrapper-env) \
		GCONV_PATH=$(common-objpfx)iconvdata LC_ALL=C \
		$($*-ENV) $(host-test-program-cmd) $($*-ARGS)
$(objpfx)%.out: %.input $(objpfx)%
	$(make-test-out) > $@ < $(word 1,$^)
$(objpfx)%.out: /dev/null $(objpfx)%	# Make it 2nd arg for canned sequence.
	$(make-test-out) > $@

endif	# tests


.PHONY: distclean realclean subdir_distclean subdir_realclean \
	subdir_clean subdir_mostlyclean subdir_testclean
subdir_mostlyclean: mostlyclean
subdir_clean: clean
subdir_distclean: distclean
subdir_realclean: realclean
subdir_testclean: do-tests-clean
realclean: distclean
distclean: clean

# We want to install everything except the library itself, but update all
# our portions of the library because the parent make will install it later
# (likewise the stubs file).
.PHONY: subdir_install
subdir_install: install-no-libc.a lib-noranlib stubs

.PHONY: subdir_objs subdir_stubs
subdir_objs: objs
subdir_stubs: stubs

# Target required by the Hurd to ensure that all the MiG-generated
# headers are in place before building a subdirectory.
.PHONY: before-compile
before-compile: $(before-compile)

$(common-objpfx)dummy.o: $(common-objpfx)dummy.c $(before-compile);
	$(compile-command.c)

# Local Variables:
# mode: makefile
# End:
