# Copyright (C) 1991-2015 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 ($(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)) $(tests-special)
xtests: tests $(xtests-special)
else
tests: $(tests:%=$(objpfx)%.out) $(tests-special)
xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-special)
endif

tests-special-notdir = $(patsubst $(objpfx)%, %, $(tests-special))
xtests-special-notdir = $(patsubst $(objpfx)%, %, $(xtests-special))
tests:
	$(..)scripts/merge-test-results.sh -s $(objpfx) $(subdir) \
	  $(sort $(tests) $(tests-special-notdir:.out=)) \
	  > $(objpfx)subdir-tests.sum
xtests:
	$(..)scripts/merge-test-results.sh -s $(objpfx) $(subdir) \
	  $(sort $(xtests) $(xtests-special-notdir:.out=)) \
	  > $(objpfx)subdir-xtests.sum

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.

define make-test-out
$(if $($*-ENV-only),$(test-wrapper-env-only) $($*-ENV-only),\
     $(test-wrapper-env) $(run-program-env) $($*-ENV)) \
$(host-test-program-cmd) $($*-ARGS)
endef
$(objpfx)%.out: %.input $(objpfx)%
	$(make-test-out) > $@ < $(word 1,$^); \
	$(evaluate-test)
$(objpfx)%.out: /dev/null $(objpfx)%	# Make it 2nd arg for canned sequence.
	$(make-test-out) > $@; \
	$(evaluate-test)

# tests-unsupported lists tests that we will not try to build at all in
# this configuration.  Note this runs every time because it does not
# actually create its target.  The dependency on Makefile is meant to
# ensure that it runs after a Makefile change to add a test to the list
# when it previously ran and produced a .out file (probably for a failure).
ifneq "$(strip $(tests-unsupported))" ""
$(tests-unsupported:%=$(objpfx)%.out): $(objpfx)%.out: Makefile
	@rm -f $@
	$(..)scripts/evaluate-test.sh $(patsubst $(common-objpfx)%.out,%,$@) \
				      77 false false > $(@:.out=.test-result)
endif

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:
