# Subroutine makefile for compiling libc modules linked into dynamic linker.

# Copyright (C) 2002,2003,2005,2006,2008,2010 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, write to the Free
# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307 USA.

# This makefile is never used by itself, but only from the rtld-libc.a
# rule in Makefile, which does make -f librtld.mk -f rtld-Rules.
# librtld.mk is the generated file containing variable definitions for
# `rtld-subdirs', a subset of the top-level $(subdirs) list; and for each
# SUBDIR in $(rtld-subdirs), `rtld-SUBDIR' listing `module.os' file names.

.PHONY: rtld-all
rtld-all:

# When run from the elf/Makefile to build rtld-libc.a, $(subdir) is elf.
ifneq ($(subdir),elf)
ifndef rtld-modules
error rtld-modules not set
endif
endif

ifndef rtld-modules
# Running to build rtld-libc.a, driving runs of $(rtld-subdir-make), below.

ifndef rtld-subdirs
error This makefile is a subroutine of elf/Makefile not to be used directly
endif

include ../Makeconfig

rtld-all: $(objpfx)rtld-libc.a

$(objpfx)rtld-libc.a: $(foreach dir,$(rtld-subdirs),\
				$(addprefix $(common-objpfx)$(dir)/rtld-,\
					    $(rtld-$(dir))))
	@-rm -f $@T
	$(AR) cq$(verbose) $@T $^
	$(RANLIB) $@T
	mv -f $@T $@

# Use the verbose option of ar and tar when not running silently.
ifeq	"$(findstring s,$(MAKEFLAGS))" ""	# if not -s
verbose := v
else						# -s
verbose	:=
endif						# not -s


# For each subdirectory, define a pattern rule that makes all of that
# subdirectory's modules at once with one recursive make command.
object-suffixes-left := $(rtld-subdirs)
define o-iterator-doit
$(foreach obj,$(rtld-$o),$(common-objpfx)%/rtld-$(obj)): FORCE ; \
	+$$(rtld-subdir-make)
endef
include $(patsubst %,../o-iterator.mk,$(object-suffixes-left))

# This is how we descend into each subdirectory.  See below.
define rtld-subdir-make
$(MAKE) $(subdir-args) objdir=$(objdir) \
	-f Makefile -f ../elf/rtld-Rules rtld-all \
	rtld-modules='$(addprefix rtld-,$(rtld-$*))'
endef

# See subdir-target-args in ../Makefile for the model.
subdir-args = subdir=$*$(if $($*-srcdir),\
			    -C $($*-srcdir) ..=`pwd`/,\
			    -C $(..)$* ..=../)

FORCE:

else

# In this case we are being run by $(rtld-subdir-make), above.
# Some other subdir's Makefile has provided all its normal rules,
# and we just provide some additional definitions.

# These are the basic compilation rules corresponding to the Makerules ones.
# The sysd-rules generated makefile already defines pattern rules for rtld-%
# targets built from sysdeps source files.
$(objpfx)rtld-%.os: rtld-%.S $(before-compile)
	$(compile-command.S) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: rtld-%.s $(before-compile)
	$(compile-command.s) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: rtld-%.c $(before-compile)
	$(compile-command.c) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: %.S $(before-compile)
	$(compile-command.S) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: %.s $(before-compile)
	$(compile-command.s) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: %.c $(before-compile)
	$(compile-command.c) $(rtld-CPPFLAGS)

# The rules for generated source files.
$(objpfx)rtld-%.os: $(objpfx)rtld-%.S $(before-compile); $(compile-command.S)
$(objpfx)rtld-%.os: $(objpfx)rtld-%.s $(before-compile); $(compile-command.s)
$(objpfx)rtld-%.os: $(objpfx)rtld-%.c $(before-compile); $(compile-command.c)
$(objpfx)rtld-%.os: $(objpfx)%.S $(before-compile); $(compile-command.S)
$(objpfx)rtld-%.os: $(objpfx)%.s $(before-compile); $(compile-command.s)
$(objpfx)rtld-%.os: $(objpfx)%.c $(before-compile); $(compile-command.c)

# The command line setting of rtld-modules (see above) tells us
# what we need to build, and that tells us what dependency files we need.
rtld-all: $(addprefix $(objpfx),$(rtld-modules))

# Figure out the dependency files we need.  After respecting the $(omit-deps)
# list as applied to the names without the `rtld-', there may be none left.
rtld-depfiles := $(patsubst %,$(objpfx)rtld-%.os.d,\
			    $(filter-out $(omit-deps),\
					 $(rtld-modules:rtld-%.os=%)))
rtld-depfiles := $(strip $(wildcard $(rtld-depfiles)) \
			 $(patsubst %.dt,%.d,\
				    $(wildcard $(rtld-depfiles:.d=.dt))))
ifdef rtld-depfiles
-include $(rtld-depfiles)
endif

# This here is the whole point of all the shenanigans.
rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1

endif
