Blame Makerules

Packit Service 82fcde
# Copyright (C) 1991-2018 Free Software Foundation, Inc.
Packit Service 82fcde
# This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
# The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
# modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
# License as published by the Free Software Foundation; either
Packit Service 82fcde
# version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
# The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
# Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
# You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
# License along with the GNU C Library; if not, see
Packit Service 82fcde
# <http://www.gnu.org/licenses/>.
Packit Service 82fcde
Packit Service 82fcde
#
Packit Service 82fcde
#	Common rules for making the GNU C library.  This file is included
Packit Service 82fcde
#	by the top-level Makefile and by all subdirectory makefiles
Packit Service 82fcde
#	(through Rules).
Packit Service 82fcde
#
Packit Service 82fcde
ifneq (,)
Packit Service 82fcde
This makefile requires GNU Make.
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
REQUIRED_MAKE_VERSION = 3.74
Packit Service 82fcde
REAL_MAKE_VERSION = $(firstword $(MAKE_VERSION))
Packit Service 82fcde
Packit Service 82fcde
ifneq ($(REQUIRED_MAKE_VERSION), \
Packit Service 82fcde
       $(firstword $(sort $(REAL_MAKE_VERSION) $(REQUIRED_MAKE_VERSION))))
Packit Service 82fcde
Wrong GNU Make version.  See above for the version needed.
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
ifdef	subdir
Packit Service 82fcde
..	:= ../
Packit Service 82fcde
endif	# subdir
Packit Service 82fcde
Packit Service 82fcde
# If `sources' was defined by the parent makefile, undefine it so
Packit Service 82fcde
# we will later get it from wildcard search in this directory.
Packit Service 82fcde
ifneq	"$(findstring env,$(origin sources))" ""
Packit Service 82fcde
sources :=
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
oPATH := $(PATH)
Packit Service 82fcde
PATH := this definition should take precedence over $(oPATH)
Packit Service 82fcde
ifeq ($(PATH),$(oPATH))
Packit Service 82fcde
You must not use the -e flag when building the GNU C library.
Packit Service 82fcde
else
Packit Service 82fcde
PATH := $(oPATH)
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
ifndef +included-Makeconfig
Packit Service 82fcde
include $(..)Makeconfig
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# This variable is used in ``include $(o-iterator)'' after defining
Packit Service 82fcde
# $(o-iterator-doit) to produce some desired rule using $o for the object
Packit Service 82fcde
# suffix, and setting $(object-suffixes-left) to $(object-suffixes); a copy
Packit Service 82fcde
# is produced for each object suffix in use.
Packit Service 82fcde
o-iterator = $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
Packit Service 82fcde

Packit Service 82fcde
# Include any system-specific makefiles.
Packit Service 82fcde
Packit Service 82fcde
# This is here so things in sysdep Makefiles can easily depend on foo.h as
Packit Service 82fcde
# appropriate and not worry about where foo.h comes from, which may be
Packit Service 82fcde
# system dependent and not known by that Makefile.
Packit Service 82fcde
vpath %.h $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
Packit Service 82fcde
				      $(+sysdep_dirs) $(..)))
Packit Service 82fcde
Packit Service 82fcde
# The same is true for RPC source files.
Packit Service 82fcde
vpath %.x $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
Packit Service 82fcde
				      $(+sysdep_dirs) $(..)))
Packit Service 82fcde
Packit Service 82fcde
# Some sysdep makefiles use this to distinguish being included here from
Packit Service 82fcde
# being included individually by a subdir makefile (hurd/Makefile needs this).
Packit Service 82fcde
in-Makerules := yes
Packit Service 82fcde
Packit Service 82fcde
sysdep-makefiles := $(wildcard $(sysdirs:=/Makefile))
Packit Service 82fcde
ifneq (,$(sysdep-makefiles))
Packit Service 82fcde
include $(sysdep-makefiles)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
# Reorder before-compile so that mach things come first, and hurd things
Packit Service 82fcde
# second, before all else.  The mach and hurd subdirectories have many
Packit Service 82fcde
# generated header files which the much of rest of the library depends on,
Packit Service 82fcde
# so it is best to build them first (and mach before hurd, at that).
Packit Service 82fcde
before-compile := $(filter $(common-objpfx)mach% $(common-objpfx)hurd%,\
Packit Service 82fcde
			   $(before-compile)) \
Packit Service 82fcde
		  $(filter-out $(common-objpfx)mach% $(common-objpfx)hurd%,\
Packit Service 82fcde
			       $(before-compile))
Packit Service 82fcde
Packit Service 82fcde
# Even before that, we need abi-versions.h which is generated right here.
Packit Service 82fcde
ifeq ($(build-shared),yes)
Packit Service 82fcde
ifndef avoid-generated
Packit Service 82fcde
before-compile := $(common-objpfx)abi-versions.h $(before-compile)
Packit Service 82fcde
$(common-objpfx)abi-versions.h: $(..)scripts/abi-versions.awk \
Packit Service 82fcde
				$(common-objpfx)Versions.all
Packit Service 82fcde
	LC_ALL=C $(AWK) -f $^ > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
Packit Service 82fcde
$(common-objpfx)%.latest: $(common-objpfx)abi-versions.h
Packit Service 82fcde
	sed -n '/ VERSION_$*_/{s/^.*_\([A-Z0-9_]*\).*$$/\1/;h;};$${g;p;}' \
Packit Service 82fcde
	    $(common-objpfx)abi-versions.h > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
Packit Service 82fcde
# first-versions.h and ldbl-compat-choose.h provide macros used in
Packit Service 82fcde
# various symbol versioning macro calls.
Packit Service 82fcde
before-compile := $(common-objpfx)first-versions.h \
Packit Service 82fcde
		  $(common-objpfx)ldbl-compat-choose.h $(before-compile)
Packit Service 82fcde
$(common-objpfx)first-versions.h: $(common-objpfx)versions.stmp
Packit Service 82fcde
$(common-objpfx)ldbl-compat-choose.h: $(common-objpfx)versions.stmp
Packit Service 82fcde
endif # avoid-generated
Packit Service 82fcde
endif # $(build-shared) = yes
Packit Service 82fcde
Packit Service 82fcde
ifndef avoid-generated
Packit Service 82fcde
ifneq (,$(CXX))
Packit Service 82fcde
# If C++ headers <cstdlib> or <cmath> are used, GCC 6 will include
Packit Service 82fcde
# /usr/include/stdlib.h or /usr/include/math.h from "#include_next"
Packit Service 82fcde
# (instead of stdlib/stdlib.h or math/math.h in the glibc source
Packit Service 82fcde
# directory), and this turns up as a make dependency.  An implicit
Packit Service 82fcde
# rule will kick in and make will try to install stdlib/stdlib.h or
Packit Service 82fcde
# math/math.h as /usr/include/stdlib.h or /usr/include/math.h because
Packit Service 82fcde
# the target is out of date.  We make a copy of <cstdlib> and <cmath>
Packit Service 82fcde
# in the glibc build directory so that stdlib/stdlib.h and math/math.h
Packit Service 82fcde
# will be used instead of /usr/include/stdlib.h and /usr/include/math.h.
Packit Service 82fcde
before-compile := $(common-objpfx)cstdlib $(common-objpfx)cmath \
Packit Service 82fcde
	          $(before-compile)
Packit Service 82fcde
$(common-objpfx)cstdlib: $(c++-cstdlib-header)
Packit Service 82fcde
	$(INSTALL_DATA) $< $@T
Packit Service 82fcde
	$(move-if-change) $@T $@
Packit Service 82fcde
$(common-objpfx)cmath: $(c++-cmath-header)
Packit Service 82fcde
	$(INSTALL_DATA) $< $@T
Packit Service 82fcde
	$(move-if-change) $@T $@
Packit Service 82fcde
ifneq (,$(c++-bits-std_abs-h))
Packit Service 82fcde
# Also make a copy of <bits/std_abs.h> from GCC 7 to prevent it from
Packit Service 82fcde
# including /usr/include/stdlib.h.
Packit Service 82fcde
before-compile := $(common-objpfx)bits/std_abs.h $(before-compile)
Packit Service 82fcde
$(common-objpfx)bits/std_abs.h: $(c++-bits-std_abs-h)
Packit Service 82fcde
	$(INSTALL_DATA) $< $@T
Packit Service 82fcde
	$(move-if-change) $@T $@
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
before-compile := $(common-objpfx)libc-abis.h $(before-compile)
Packit Service 82fcde
$(common-objpfx)libc-abis.h: $(common-objpfx)libc-abis.stamp; @:
Packit Service 82fcde
$(common-objpfx)libc-abis.stamp: $(..)scripts/gen-libc-abis \
Packit Service 82fcde
			     $(firstword $(wildcard $(sysdirs:=/libc-abis)) \
Packit Service 82fcde
					 $(..)libc-abis) \
Packit Service 82fcde
			     $(..)Makerules
Packit Service 82fcde
	$(SHELL) $< \
Packit Service 82fcde
		 $(base-machine)-$(config-vendor)-$(config-os) \
Packit Service 82fcde
		 < $(word 2,$^) > $(@:.stamp=.h)T
Packit Service 82fcde
	$(move-if-change) $(@:.stamp=.h)T $(@:.stamp=.h)
Packit Service 82fcde
	touch $@
Packit Service 82fcde
common-generated += $(common-objpfx)libc-abis.h
Packit Service 82fcde
endif # avoid-generated
Packit Service 82fcde
Packit Service 82fcde
ifeq (yes,$(build-shared))
Packit Service 82fcde
$(common-objpfx)runtime-linker.h: $(common-objpfx)runtime-linker.stamp; @:
Packit Service 82fcde
$(common-objpfx)runtime-linker.stamp: $(common-objpfx)config.make
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	echo '#define RUNTIME_LINKER "$(rtlddir)/$(rtld-installed-name)"' \
Packit Service 82fcde
		> ${@:stamp=T}
Packit Service 82fcde
	$(move-if-change) ${@:stamp=T} ${@:stamp=h}
Packit Service 82fcde
	touch $@
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Make sure the subdirectory for object files gets created.
Packit Service 82fcde
ifdef objpfx
Packit Service 82fcde
ifeq (,$(wildcard $(objpfx).))
Packit Service 82fcde
before-compile += $(objpfx).
Packit Service 82fcde
$(objpfx).:
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Remove existing files from `before-compile'.  Things are added there when
Packit Service 82fcde
# they must exist for dependency generation to work right, but once they
Packit Service 82fcde
# exist there is no further need for every single file to depend on them,
Packit Service 82fcde
# and those gratuitous dependencies result in many gratuitous
Packit Service 82fcde
# recompilations.
Packit Service 82fcde
before-compile := $(filter-out $(wildcard $(before-compile)),$(before-compile))
Packit Service 82fcde
Packit Service 82fcde
# Don't let any before-compile file be an intermediate and get removed.
Packit Service 82fcde
ifdef before-compile
Packit Service 82fcde
$(before-compile):
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# We don't want $(common-objpfx) files to depend on miscellaneous stuff
Packit Service 82fcde
# in subdirs.
Packit Service 82fcde
ifdef subdir
Packit Service 82fcde
common-before-compile := $(filter-out $(objpfx)%,$(before-compile))
Packit Service 82fcde
else
Packit Service 82fcde
common-before-compile = $(before-compile)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifndef subdir
Packit Service 82fcde
# If a makefile needs to do something conditional on something that
Packit Service 82fcde
# can only be figured out from headers, write a FOO.make.c input
Packit Service 82fcde
# file that uses cpp contructs and contains @@@ LINE @@@ for each LINE
Packit Service 82fcde
# to emit in the generated makefile, and use -include $(common-objpfx)FOO.make.
Packit Service 82fcde
#
Packit Service 82fcde
# We only generate these in the top-level makefile, to avoid any weirdness
Packit Service 82fcde
# from subdir-specific makefile tweaks creeping in on an update.
Packit Service 82fcde
$(common-objpfx)%.make: $(..)%.make.c $(..)Makerules $(common-before-compile)
Packit Service 82fcde
	rm -f $@T $@.dT
Packit Service 82fcde
	(echo '# Generated from $*.make.c by Makerules.'; \
Packit Service 82fcde
	 $(CC) $(CFLAGS) $(CPPFLAGS) -E -DASSEMBLER $< \
Packit Service 82fcde
	       -MD -MP -MT '$$(common-objpfx)$*.make' -MF $@.dT \
Packit Service 82fcde
	 | sed -n '/@@@/{s/@@@[	 ]*\(.*\)@@@/\1/;s/[	 ]*$$//p;}'; \
Packit Service 82fcde
	 echo 'common-generated += $(@F)'; \
Packit Service 82fcde
	 sed $(sed-remove-objpfx) $(sed-remove-dotdot) $@.dT; \
Packit Service 82fcde
	 rm -f $@.dT) > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifdef subdir
Packit Service 82fcde
sed-remove-dotdot := -e 's@  *\.\.\/\([^ 	\]*\)@ $$(..)\1@g' \
Packit Service 82fcde
		     -e 's@^\.\.\/\([^ 	\]*\)@$$(..)\1@g'
Packit Service 82fcde
else
Packit Service 82fcde
sed-remove-dotdot := -e 's@  *\([^ 	\/$$][^ 	\]*\)@ $$(..)\1@g' \
Packit Service 82fcde
		     -e 's@^\([^ 	\/$$][^ 	\]*\)@$$(..)\1@g'
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifdef gen-py-const-headers
Packit Service 82fcde
# We'll use a static pattern rule to match .pysym files with their
Packit Service 82fcde
# corresponding generated .py files.
Packit Service 82fcde
# The generated .py files go in the submodule's dir in the glibc build dir.
Packit Service 82fcde
py-const-files := $(patsubst %.pysym,%.py,$(gen-py-const-headers))
Packit Service 82fcde
py-const-dir := $(objpfx)
Packit Service 82fcde
py-const := $(addprefix $(py-const-dir),$(py-const-files))
Packit Service 82fcde
py-const-script := $(..)scripts/gen-py-const.awk
Packit Service 82fcde
Packit Service 82fcde
# This is a hack we use to generate .py files with constants for Python
Packit Service 82fcde
# pretty printers.  It works the same way as gen-as-const.
Packit Service 82fcde
# See scripts/gen-py-const.awk for details on how the awk | gcc mechanism
Packit Service 82fcde
# works.
Packit Service 82fcde
#
Packit Service 82fcde
# $@.tmp and $@.tmp2 are temporary files we use to store the partial contents
Packit Service 82fcde
# of the target file.  We do this instead of just writing on $@ because, if the
Packit Service 82fcde
# build process terminates prematurely, re-running Make wouldn't run this rule
Packit Service 82fcde
# since Make would see that the target file already exists (despite it being
Packit Service 82fcde
# incomplete).
Packit Service 82fcde
#
Packit Service 82fcde
# The sed line replaces "@name@SOME_NAME@value@SOME_VALUE@" strings from the
Packit Service 82fcde
# output of 'gcc -S' with "SOME_NAME = SOME_VALUE" strings.
Packit Service 82fcde
# The '-n' option, combined with the '/p' command, makes sed output only the
Packit Service 82fcde
# modified lines instead of the whole input file.  The output is redirected
Packit Service 82fcde
# to a .py file; we'll import it in the pretty printers file to read
Packit Service 82fcde
# the constants generated by gen-py-const.awk.
Packit Service 82fcde
# The regex has two capturing groups, for SOME_NAME and SOME_VALUE
Packit Service 82fcde
# respectively.  Notice SOME_VALUE may be prepended by a special character,
Packit Service 82fcde
# depending on the assembly syntax (e.g. immediates are prefixed by a '$'
Packit Service 82fcde
# in AT&T x86, and by a '#' in ARM).  We discard it using a complemented set
Packit Service 82fcde
# before the second capturing group.
Packit Service 82fcde
$(py-const): $(py-const-dir)%.py: %.pysym $(py-const-script) \
Packit Service 82fcde
	     $(common-before-compile)
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	$(AWK) -f $(py-const-script) $< \
Packit Service 82fcde
	       | $(CC) -S -o $@.tmp $(CFLAGS) $(CPPFLAGS) -x c -
Packit Service 82fcde
	echo '# GENERATED FILE\n' > $@.tmp2
Packit Service 82fcde
	echo '# Constant definitions for pretty printers.' >> $@.tmp2
Packit Service 82fcde
	echo '# See gen-py-const.awk for details.\n' >> $@.tmp2
Packit Service 82fcde
	sed -n -r 's/^.*@name@([^@]+)@value@[^[:xdigit:]Xx-]*([[:xdigit:]Xx-]+)@.*/\1 = \2/p' \
Packit Service 82fcde
	    $@.tmp >> $@.tmp2
Packit Service 82fcde
	mv -f $@.tmp2 $@
Packit Service 82fcde
	rm -f $@.tmp
Packit Service 82fcde
Packit Service 82fcde
generated += $(py-const)
Packit Service 82fcde
endif  # gen-py-const-headers
Packit Service 82fcde
Packit Service 82fcde
ifdef gen-as-const-headers
Packit Service 82fcde
# Generating headers for assembly constants.
Packit Service 82fcde
# We need this defined early to get into before-compile before
Packit Service 82fcde
# it's used in sysd-rules, below.
Packit Service 82fcde
# Define GEN_AS_CONST_HEADERS to avoid circular dependency [BZ #22792].
Packit Service 82fcde
# NB: <tcb-offsets.h> is generated from tcb-offsets.sym to define
Packit Service 82fcde
# offsets and sizes of types in <tls.h> and maybe <pthread.h> which
Packit Service 82fcde
# may include <tcb-offsets.h>.  Target header files can check if
Packit Service 82fcde
# GEN_AS_CONST_HEADERS is defined to avoid circular dependency which
Packit Service 82fcde
# may lead to build hang on a many-core machine.
Packit Service 82fcde
$(common-objpfx)%.h $(common-objpfx)%.h.d: $(..)scripts/gen-as-const.awk \
Packit Service 82fcde
					   %.sym $(common-before-compile)
Packit Service 82fcde
	$(AWK) -f $< $(filter %.sym,$^) \
Packit Service 82fcde
	| $(CC) -S -o $(@:.h.d=.h)T3 $(CFLAGS) $(CPPFLAGS) \
Packit Service 82fcde
		-DGEN_AS_CONST_HEADERS -x c - \
Packit Service 82fcde
		-MD -MP -MF $(@:.h=.h.d)T -MT '$(@:.h=.h.d) $(@:.h.d=.h)'
Packit Service 82fcde
	sed -n 's/^.*@@@name@@@\([^@]*\)@@@value@@@[^0-9Xxa-fA-F-]*\([0-9Xxa-fA-F-][0-9Xxa-fA-F-]*\).*@@@end@@@.*$$/#define \1 \2/p' \
Packit Service 82fcde
		$(@:.h.d=.h)T3 > $(@:.h.d=.h)T
Packit Service 82fcde
	rm -f $(@:.h.d=.h)T3
Packit Service 82fcde
	sed $(sed-remove-objpfx) $(sed-remove-dotdot) \
Packit Service 82fcde
	    $(@:.h=.h.d)T > $(@:.h=.h.d)T2
Packit Service 82fcde
	rm -f $(@:.h=.h.d)T
Packit Service 82fcde
	mv -f $(@:.h=.h.d)T2 $(@:.h=.h.d)
Packit Service 82fcde
	mv -f $(@:.h.d=.h)T $(@:.h.d=.h)
Packit Service 82fcde
vpath %.sym $(sysdirs)
Packit Service 82fcde
before-compile += $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
Packit Service 82fcde
Packit Service 82fcde
tests-internal += $(gen-as-const-headers:%.sym=test-as-const-%)
Packit Service 82fcde
generated += $(gen-as-const-headers:%.sym=test-as-const-%.c)
Packit Service 82fcde
$(objpfx)test-as-const-%.c: $(..)scripts/gen-as-const.awk $(..)Makerules \
Packit Service 82fcde
			    %.sym $(common-objpfx)%.h
Packit Service 82fcde
	($(AWK) '{ sub(/^/, "asconst_", $$2); print; }' $(filter %.h,$^); \
Packit Service 82fcde
	 $(AWK) -v test=1 -f $< $(filter %.sym,$^); \
Packit Service 82fcde
	 echo '#include "$(..)test-skeleton.c"') > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
ifeq (yes,$(build-shared))
Packit Service 82fcde
# Generate the header containing the names of all shared libraries.
Packit Service 82fcde
# We use a stamp file to avoid unnecessary recompilations.
Packit Service 82fcde
before-compile += $(common-objpfx)gnu/lib-names.h
Packit Service 82fcde
ifeq ($(soversions.mk-done),t)
Packit Service 82fcde
ifndef abi-variants
Packit Service 82fcde
lib-names-h-abi = gnu/lib-names.h
Packit Service 82fcde
lib-names-stmp-abi = gnu/lib-names.stmp
Packit Service 82fcde
else
Packit Service 82fcde
lib-names-h-abi = gnu/lib-names-$(default-abi).h
Packit Service 82fcde
lib-names-stmp-abi = gnu/lib-names-$(default-abi).stmp
Packit Service 82fcde
before-compile += $(common-objpfx)$(lib-names-h-abi)
Packit Service 82fcde
common-generated += gnu/lib-names.h
Packit Service 82fcde
install-others-nosubdir: $(inst_includedir)/$(lib-names-h-abi)
Packit Service 82fcde
$(common-objpfx)gnu/lib-names.h:
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	{ \
Packit Service 82fcde
	 echo '/* This file is automatically generated.';\
Packit Service 82fcde
	 echo '   It defines macros to allow user program to find the shared'; \
Packit Service 82fcde
	 echo '   library files which come as part of GNU libc.  */'; \
Packit Service 82fcde
	 echo '#ifndef __GNU_LIB_NAMES_H'; \
Packit Service 82fcde
	 echo '#define __GNU_LIB_NAMES_H	1'; \
Packit Service 82fcde
	 echo ''; \
Packit Service 82fcde
	 $(if $(abi-includes), \
Packit Service 82fcde
	  $(foreach h,$(abi-includes), echo '#include <$(h)>';) \
Packit Service 82fcde
	  echo '';) \
Packit Service 82fcde
	 $(foreach v,$(abi-variants),\
Packit Service 82fcde
	 $(if $(abi-$(v)-condition),\
Packit Service 82fcde
	 echo '#if $(abi-$(v)-condition)'; \
Packit Service 82fcde
	 echo '# include <gnu/lib-names-$(v).h>'); \
Packit Service 82fcde
	 $(if $(abi-$(v)-condition),echo '#endif';)) \
Packit Service 82fcde
	 echo ''; \
Packit Service 82fcde
	 echo '#endif	/* gnu/lib-names.h */'; \
Packit Service 82fcde
	} >  $@
Packit Service 82fcde
endif
Packit Service 82fcde
$(common-objpfx)$(lib-names-h-abi): $(common-objpfx)$(lib-names-stmp-abi); @:
Packit Service 82fcde
$(common-objpfx)$(lib-names-stmp-abi): $(..)scripts/lib-names.awk \
Packit Service 82fcde
				       $(common-objpfx)soversions.i
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	{ \
Packit Service 82fcde
	 $(if $(abi-variants), \
Packit Service 82fcde
	 echo '/* This file is automatically generated.  */';\
Packit Service 82fcde
	 echo '#ifndef __GNU_LIB_NAMES_H'; \
Packit Service 82fcde
	 echo '# error "Never use <$(lib-names-h-abi)> directly; include <gnu/lib-names.h> instead."'; \
Packit Service 82fcde
	 echo '#endif';, \
Packit Service 82fcde
	 echo '/* This file is automatically generated.';\
Packit Service 82fcde
	 echo '   It defines macros to allow user program to find the shared'; \
Packit Service 82fcde
	 echo '   library files which come as part of GNU libc.  */'; \
Packit Service 82fcde
	 echo '#ifndef __GNU_LIB_NAMES_H'; \
Packit Service 82fcde
	 echo '#define __GNU_LIB_NAMES_H	1';) \
Packit Service 82fcde
	 echo ''; \
Packit Service 82fcde
	 ($(foreach s,$(all-sonames), echo $(s);)) \
Packit Service 82fcde
	 | LC_ALL=C $(AWK) -f $(firstword $^) | LC_ALL=C sort; \
Packit Service 82fcde
	 $(if $(abi-variants),, \
Packit Service 82fcde
	 echo ''; \
Packit Service 82fcde
	 echo '#endif	/* gnu/lib-names.h */';) \
Packit Service 82fcde
	} >  ${@:stmp=T}
Packit Service 82fcde
	$(move-if-change) ${@:stmp=T} ${@:stmp=h}
Packit Service 82fcde
	touch $@
Packit Service 82fcde
endif
Packit Service 82fcde
common-generated += $(lib-names-h-abi) $(lib-names-stmp-abi)
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
###############################################################################
Packit Service 82fcde
# NOTE!  Everything adding to before-compile needs to come before this point! #
Packit Service 82fcde
###############################################################################
Packit Service 82fcde
Packit Service 82fcde
# Generate an ordered list of implicit rules which find the source files in
Packit Service 82fcde
# each sysdep directory.  The old method was to use vpath to search all the
Packit Service 82fcde
# sysdep directories.  However, that had the problem that a .S file in a
Packit Service 82fcde
# later directory would be chosen over a .c file in an earlier directory,
Packit Service 82fcde
# which does not preserve the desired sysdeps ordering behavior.
Packit Service 82fcde
Packit Service 82fcde
# System-dependent makefiles can put in `inhibit-sysdep-asm' regexps
Packit Service 82fcde
# matching sysdep directories whose assembly source files should be
Packit Service 82fcde
# suppressed.
Packit Service 82fcde
Packit Service 82fcde
-include $(common-objpfx)sysd-rules
Packit Service 82fcde
ifneq ($(sysd-rules-sysdirs),$(config-sysdirs))
Packit Service 82fcde
# The value of $(+sysdep_dirs) the sysd-rules was computed for
Packit Service 82fcde
# differs from the one we are using now.  So force a rebuild of sysd-rules.
Packit Service 82fcde
sysd-rules-force = FORCE
Packit Service 82fcde
FORCE:
Packit Service 82fcde
endif
Packit Service 82fcde
$(common-objpfx)sysd-rules: $(..)scripts/sysd-rules.awk \
Packit Service 82fcde
			    $(common-objpfx)config.make $(..)Makerules \
Packit Service 82fcde
			    $(sysdep-makefiles) $(sysdep-makeconfigs) \
Packit Service 82fcde
			    $(sysd-rules-force)
Packit Service 82fcde
	-@rm -f $@T
Packit Service 82fcde
	LC_ALL=C $(AWK) -f $< > $@T \
Packit Service 82fcde
			-v all_object_suffixes='$(all-object-suffixes)' \
Packit Service 82fcde
			-v inhibit_sysdep_asm='$(inhibit-sysdep-asm)' \
Packit Service 82fcde
			-v sysd_rules_patterns='$(sysd-rules-patterns)' \
Packit Service 82fcde
			-v config_sysdirs='$(config-sysdirs)'
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
Packit Service 82fcde
ifndef sysd-rules-done
Packit Service 82fcde
# Don't do deps until this exists, because it provides rules to make the deps.
Packit Service 82fcde
no_deps=t
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(all-object-suffixes)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(all-object-suffixes)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)%$o: %.cc $(before-compile); $$(compile-command.cc)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(all-object-suffixes)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
# Omit the objpfx rules when building in the source tree, because
Packit Service 82fcde
# objpfx is empty and so these rules just override the ones above.
Packit Service 82fcde
ifdef objpfx
Packit Service 82fcde
# Define first rules to find the source files in $(objpfx).
Packit Service 82fcde
# Generated source files will end up there.
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(all-object-suffixes)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(all-object-suffixes)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Generate version maps, but wait until sysdep-subdirs is known
Packit Service 82fcde
ifeq ($(sysd-sorted-done),t)
Packit Service 82fcde
ifeq ($(build-shared),yes)
Packit Service 82fcde
-include $(common-objpfx)sysd-versions
Packit Service 82fcde
$(addprefix $(common-objpfx),$(version-maps)): $(common-objpfx)sysd-versions
Packit Service 82fcde
common-generated += $(version-maps)
Packit Service 82fcde
postclean-generated += sysd-versions Versions.all abi-versions.h \
Packit Service 82fcde
		       Versions.def Versions.v.i Versions.v
Packit Service 82fcde
Packit Service 82fcde
ifndef avoid-generated
Packit Service 82fcde
ifneq ($(sysd-versions-subdirs),$(sorted-subdirs) $(config-sysdirs))
Packit Service 82fcde
sysd-versions-force = FORCE
Packit Service 82fcde
FORCE:
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
$(common-objpfx)Versions.def: $(..)scripts/versionlist.awk \
Packit Service 82fcde
			      $(common-objpfx)Versions.v
Packit Service 82fcde
	LC_ALL=C $(AWK) -f $^ > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
Packit Service 82fcde
$(common-objpfx)Versions.all: $(..)scripts/firstversions.awk \
Packit Service 82fcde
			      $(common-objpfx)soversions.i \
Packit Service 82fcde
			      $(common-objpfx)Versions.def
Packit Service 82fcde
	{ while read which lib version setname; do \
Packit Service 82fcde
	    test x"$$which" = xDEFAULT || continue; \
Packit Service 82fcde
	    test -z "$$setname" || echo "$$lib : $$setname"; \
Packit Service 82fcde
	  done < $(word 2,$^); \
Packit Service 82fcde
	  cat $(word 3,$^); \
Packit Service 82fcde
	} | LC_ALL=C $(AWK) -f $< > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
# See %.v/%.v.i implicit rules in Makeconfig.
Packit Service 82fcde
$(common-objpfx)Versions.v.i: $(wildcard $(subdirs:%=$(..)%/Versions)) \
Packit Service 82fcde
			      $(wildcard $(sysdirs:%=%/Versions)) \
Packit Service 82fcde
			      $(sysd-versions-force)
Packit Service 82fcde
$(common-objpfx)sysd-versions: $(common-objpfx)versions.stmp
Packit Service 82fcde
$(common-objpfx)versions.stmp: $(common-objpfx)Versions.all \
Packit Service 82fcde
			       $(common-objpfx)Versions.v \
Packit Service 82fcde
			       $(..)scripts/versions.awk
Packit Service 82fcde
	( echo 'sysd-versions-subdirs = $(subdirs) $(config-sysdirs)' ; \
Packit Service 82fcde
	  cat $(word 2,$^) \
Packit Service 82fcde
	  | LC_ALL=C $(AWK) -v buildroot=$(common-objpfx) -v defsfile=$< \
Packit Service 82fcde
			    -v move_if_change='$(move-if-change)' \
Packit Service 82fcde
			    -f $(word 3,$^); \
Packit Service 82fcde
	) > $(common-objpfx)sysd-versionsT
Packit Service 82fcde
	mv -f $(common-objpfx)sysd-versionsT $(common-objpfx)sysd-versions
Packit Service 82fcde
	touch $@
Packit Service 82fcde
endif # avoid-generated
Packit Service 82fcde
endif # $(build-shared) = yes
Packit Service 82fcde
endif # sysd-sorted-done
Packit Service 82fcde
Packit Service 82fcde
# Generate .dT files as we compile.
Packit Service 82fcde
compile-mkdep-flags = -MD -MP -MF $@.dt -MT $@
Packit Service 82fcde
compile-command.S = $(compile.S) $(OUTPUT_OPTION) $(compile-mkdep-flags)
Packit Service 82fcde
compile-command.c = $(compile.c) $(OUTPUT_OPTION) $(compile-mkdep-flags)
Packit Service 82fcde
compile-command.cc = $(compile.cc) $(OUTPUT_OPTION) $(compile-mkdep-flags)
Packit Service 82fcde
Packit Service 82fcde
# Like compile-mkdep-flags, but for use with $(BUILD_CC).  We don't want to
Packit Service 82fcde
# track system includes here, they may spuriously trigger an install rule,
Packit Service 82fcde
# and would cause the check-local-headers test to fail.
Packit Service 82fcde
native-compile-mkdep-flags = -MMD -MP -MF $@.dt -MT $@
Packit Service 82fcde
Packit Service 82fcde
# GCC can grok options after the file name, and it looks nicer that way.
Packit Service 82fcde
compile.c = $(CC) $< -c $(CFLAGS) $(CPPFLAGS)
Packit Service 82fcde
compile.cc = $(CXX) $< -c $(CXXFLAGS) $(CPPFLAGS)
Packit Service 82fcde
compile.S = $(CC) $< -c $(CPPFLAGS) $(S-CPPFLAGS) \
Packit Service 82fcde
		  $(ASFLAGS) $(ASFLAGS-$(suffix $@))
Packit Service 82fcde
COMPILE.c = $(CC) -c $(CFLAGS) $(CPPFLAGS)
Packit Service 82fcde
COMPILE.S = $(CC) -c $(CPPFLAGS) $(S-CPPFLAGS) \
Packit Service 82fcde
		  $(ASFLAGS) $(ASFLAGS-$(suffix $@))
Packit Service 82fcde
Packit Service 82fcde
# We need this for the output to go in the right place.  It will default to
Packit Service 82fcde
# empty if make was configured to work with a cc that can't grok -c and -o
Packit Service 82fcde
# together.  You can't compile the C library with such a compiler.
Packit Service 82fcde
OUTPUT_OPTION = -o $@
Packit Service 82fcde
Packit Service 82fcde
# This is the end of the pipeline for compiling generated C code.
Packit Service 82fcde
compile-stdin.c = $(COMPILE.c) -o $@ -x c - $(compile-mkdep-flags)
Packit Service 82fcde
Packit Service 82fcde
# We need the $(CFLAGS) to be in there to have the right predefines during
Packit Service 82fcde
# the dependency run for C sources.  But having it for assembly sources can
Packit Service 82fcde
# get the wrong predefines.
Packit Service 82fcde
S-CPPFLAGS = -DASSEMBLER $(asm-CPPFLAGS)
Packit Service 82fcde
Packit Service 82fcde
define +make-deps
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
$(+mkdep) $< $(if $(filter %.c,$<),$(CFLAGS)) \
Packit Service 82fcde
	     $(CPPFLAGS) $($(patsubst .%,%,$(suffix $(
Packit Service 82fcde
's,$(subst .,\.,$(@F:.d=.o)),$(foreach o,$(all-object-suffixes),$(@:.d=$o)) $@,' \
Packit Service 82fcde
$(sed-remove-objpfx) $(sed-remove-dotdot) > $(@:.d=.T)
Packit Service 82fcde
mv -f $(@:.d=.T) $@ $(generate-md5)
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
ifneq (,$(objpfx))
Packit Service 82fcde
# Continuation lines here are dangerous because they introduce spaces!
Packit Service 82fcde
define sed-remove-objpfx
Packit Service 82fcde
-e 's@ $(subst .,\.,$(subst @,\@,$(common-objpfx)))@ $$(common-objpfx)@g' \
Packit Service 82fcde
-e 's@^$(subst .,\.,$(subst @,\@,$(common-objpfx)))@$$(common-objpfx)@g'
Packit Service 82fcde
endef
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
# Modify the list of routines we build for different targets
Packit Service 82fcde
Packit Service 82fcde
ifeq (yes,$(build-shared))
Packit Service 82fcde
ifndef libc.so-version
Packit Service 82fcde
# Undefine this because it can't work when we libc.so is unversioned.
Packit Service 82fcde
static-only-routines =
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
elide-routines.oS += $(filter-out $(static-only-routines),\
Packit Service 82fcde
				  $(routines) $(aux) $(sysdep_routines))
Packit Service 82fcde
elide-routines.os += $(static-only-routines)
Packit Service 82fcde
Packit Service 82fcde
# If we have versioned code we don't need the old versions in any of the
Packit Service 82fcde
# static libraries.
Packit Service 82fcde
elide-routines.o  += $(shared-only-routines)
Packit Service 82fcde
elide-routines.op += $(shared-only-routines)
Packit Service 82fcde

Packit Service 82fcde
# Shared library building.
Packit Service 82fcde
Packit Service 82fcde
ifeq (yes,$(build-shared))
Packit Service 82fcde
Packit Service 82fcde
# Reference map file only when shared libraries are built and a map file name
Packit Service 82fcde
# is given.
Packit Service 82fcde
ifeq ($(build-shared),yes)
Packit Service 82fcde
map-file = $(firstword $($(@F:.so=-map)) \
Packit Service 82fcde
		       $(addprefix $(common-objpfx), \
Packit Service 82fcde
				   $(filter $(@F:.so=.map),$(version-maps))))
Packit Service 82fcde
load-map-file = $(map-file:%=-Wl,--version-script=%)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Compiler arguments to use to link a shared object with libc and
Packit Service 82fcde
# ld.so.  This is intended to be as similar as possible to a default
Packit Service 82fcde
# link with an installed libc.
Packit Service 82fcde
link-libc-args = -Wl,--start-group \
Packit Service 82fcde
		 $(libc-for-link) \
Packit Service 82fcde
		 $(common-objpfx)libc_nonshared.a \
Packit Service 82fcde
		 $(as-needed) $(elf-objpfx)ld.so $(no-as-needed) \
Packit Service 82fcde
		 -Wl,--end-group
Packit Service 82fcde
Packit Service 82fcde
# The corresponding shared libc to use.  This may be modified for a
Packit Service 82fcde
# particular target.
Packit Service 82fcde
libc-for-link = $(common-objpfx)libc.so
Packit Service 82fcde
Packit Service 82fcde
# The corresponding dependencies.  As these are used in dependencies,
Packit Service 82fcde
# not just commands, they cannot use target-specific variables so need
Packit Service 82fcde
# to name both possible libc.so objects.
Packit Service 82fcde
link-libc-deps = $(common-objpfx)libc.so $(common-objpfx)linkobj/libc.so \
Packit Service 82fcde
		 $(common-objpfx)libc_nonshared.a $(elf-objpfx)ld.so
Packit Service 82fcde
Packit Service 82fcde
# Pattern rule to build a shared object from an archive of PIC objects.
Packit Service 82fcde
# This must come after the installation rules so Make doesn't try to
Packit Service 82fcde
# build shared libraries in place from the installed *_pic.a files.
Packit Service 82fcde
# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
Packit Service 82fcde
# on other shared objects.  The linking with libc and ld.so is intended
Packit Service 82fcde
# to be as similar as possible to a default link with an installed libc.
Packit Service 82fcde
lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(link-libc-deps)
Packit Service 82fcde
	$(build-shlib) $(link-libc-args)
Packit Service 82fcde
	$(call after-link,$@)
Packit Service 82fcde
Packit Service 82fcde
define build-shlib-helper
Packit Service 82fcde
$(LINK.o) -shared -static-libgcc -Wl,-O1 $(sysdep-LDFLAGS) \
Packit Service 82fcde
	  $(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) $(rtld-LDFLAGS) \
Packit Service 82fcde
	  $(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \
Packit Service 82fcde
	  $(extra-B-$(@F:lib%.so=%).so) $(load-map-file) \
Packit Service 82fcde
	  -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
Packit Service 82fcde
	  $(LDFLAGS.so) $(LDFLAGS-lib.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
Packit Service 82fcde
	  -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
ifeq (yes,$(use-default-link))
Packit Service 82fcde
# If the linker is good enough, we can let it use its default linker script.
Packit Service 82fcde
shlib-lds =
Packit Service 82fcde
shlib-lds-flags =
Packit Service 82fcde
else
Packit Service 82fcde
# binutils only position loadable notes into the first page for binaries,
Packit Service 82fcde
# not for shared objects
Packit Service 82fcde
$(common-objpfx)shlib.lds: $(common-objpfx)config.make $(..)Makerules
Packit Service 82fcde
	$(LINK.o) -shared -Wl,-O1 \
Packit Service 82fcde
		  -nostdlib -nostartfiles \
Packit Service 82fcde
		  $(sysdep-LDFLAGS) $(rtld-LDFLAGS) $(LDFLAGS.so) \
Packit Service 82fcde
		  -Wl,--verbose 2>&1 | \
Packit Service 82fcde
	  sed > $@T \
Packit Service 82fcde
	      -e '/^=========/,/^=========/!d;/^=========/d' \
Packit Service 82fcde
	      $(if $(filter yes,$(have-hash-style)), \
Packit Service 82fcde
		   -e 's/^.*\.gnu\.hash[ 	]*:.*$$/  .note.ABI-tag : { *(.note.ABI-tag) } &/' \
Packit Service 82fcde
		   -e '/^[ 	]*\.hash[ 	]*:.*$$/{h;d;}' \
Packit Service 82fcde
		   -e '/DATA_SEGMENT_ALIGN/{H;g}' \
Packit Service 82fcde
		, \
Packit Service 82fcde
		   -e 's/^.*\.hash[ 	]*:.*$$/  .note.ABI-tag : { *(.note.ABI-tag) } &/' \
Packit Service 82fcde
	       ) \
Packit Service 82fcde
	      -e 's/^.*\*(\.dynbss).*$$/& \
Packit Service 82fcde
		 PROVIDE(__start___libc_freeres_ptrs = .); \
Packit Service 82fcde
		 *(__libc_freeres_ptrs) \
Packit Service 82fcde
		 PROVIDE(__stop___libc_freeres_ptrs = .);/'\
Packit Service 82fcde
	      -e 's@^.*\*(\.jcr).*$$@& \
Packit Service 82fcde
		 PROVIDE(__start___libc_subfreeres = .);\
Packit Service 82fcde
		 __libc_subfreeres : { *(__libc_subfreeres) }\
Packit Service 82fcde
		 PROVIDE(__stop___libc_subfreeres = .);\
Packit Service 82fcde
		 PROVIDE(__start___libc_atexit = .);\
Packit Service 82fcde
		 __libc_atexit : { *(__libc_atexit) }\
Packit Service 82fcde
		 PROVIDE(__stop___libc_atexit = .);\
Packit Service 82fcde
		 PROVIDE(__start___libc_IO_vtables = .);\
Packit Service 82fcde
		 __libc_IO_vtables : { *(__libc_IO_vtables) }\
Packit Service 82fcde
		 PROVIDE(__stop___libc_IO_vtables = .);\
Packit Service 82fcde
		 /DISCARD/ : { *(.gnu.glibc-stub.*) }@'
Packit Service 82fcde
	test -s $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
common-generated += shlib.lds
Packit Service 82fcde
Packit Service 82fcde
shlib-lds = $(common-objpfx)shlib.lds
Packit Service 82fcde
shlib-lds-flags = -T $(shlib-lds)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
define build-shlib
Packit Service 82fcde
$(build-shlib-helper) -o $@ $(shlib-lds-flags) \
Packit Service 82fcde
	  $(csu-objpfx)abi-note.o $(build-shlib-objlist)
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
define build-module-helper
Packit Service 82fcde
$(LINK.o) -shared -static-libgcc $(sysdep-LDFLAGS) $(rtld-LDFLAGS) \
Packit Service 82fcde
	  $(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) \
Packit Service 82fcde
	  -B$(csu-objpfx) $(load-map-file) \
Packit Service 82fcde
	  $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \
Packit Service 82fcde
	  -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# This macro is similar to build-shlib but it does not define a soname
Packit Service 82fcde
# and it does not depend on the destination name to start with `lib'.
Packit Service 82fcde
# binutils only position loadable notes into the first page for binaries,
Packit Service 82fcde
# not for shared objects
Packit Service 82fcde
define build-module
Packit Service 82fcde
$(build-module-helper) -o $@ $(shlib-lds-flags) \
Packit Service 82fcde
	  $(csu-objpfx)abi-note.o $(build-module-objlist) $(link-libc-args)
Packit Service 82fcde
$(call after-link,$@)
Packit Service 82fcde
endef
Packit Service 82fcde
define build-module-asneeded
Packit Service 82fcde
$(build-module-helper) -o $@ $(shlib-lds-flags) \
Packit Service 82fcde
	  $(csu-objpfx)abi-note.o \
Packit Service 82fcde
	  -Wl,--as-needed $(build-module-objlist) -Wl,--no-as-needed \
Packit Service 82fcde
	  $(link-libc-args)
Packit Service 82fcde
$(call after-link,$@)
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# sofini.os must be placed last since it terminates .eh_frame section.
Packit Service 82fcde
build-module-helper-objlist = \
Packit Service 82fcde
	$(patsubst %_pic.a,$(whole-archive) %_pic.a $(no-whole-archive),\
Packit Service 82fcde
		   $(filter-out %.lds $(map-file) $(+preinit) $(+postinit) \
Packit Service 82fcde
				$(elf-objpfx)sofini.os \
Packit Service 82fcde
				$(link-libc-deps),$^))
Packit Service 82fcde
Packit Service 82fcde
build-module-objlist = $(build-module-helper-objlist) $(LDLIBS-$(@F:%.so=%).so)
Packit Service 82fcde
build-shlib-objlist = $(build-module-helper-objlist) \
Packit Service 82fcde
		      $(LDLIBS-$(@F:lib%.so=%).so) \
Packit Service 82fcde
		      $(filter $(elf-objpfx)sofini.os,$^)
Packit Service 82fcde
Packit Service 82fcde
# Don't try to use -lc when making libc.so itself.
Packit Service 82fcde
# Also omits crti.o and crtn.o, which we do not want
Packit Service 82fcde
# since we define our own `.init' section specially.
Packit Service 82fcde
LDFLAGS-c.so = -nostdlib -nostartfiles
Packit Service 82fcde
# But we still want to link libc.so against $(libc.so-gnulib).
Packit Service 82fcde
LDLIBS-c.so += $(libc.so-gnulib)
Packit Service 82fcde
# Give libc.so an entry point and make it directly runnable itself.
Packit Service 82fcde
LDFLAGS-c.so += -e __libc_main
Packit Service 82fcde
# Pre-link the objects of libc_pic.a so that we can locally resolve
Packit Service 82fcde
# COMMON symbols before we link against ld.so.  This is because ld.so
Packit Service 82fcde
# contains some of libc_pic.a already, which will prevent the COMMONs
Packit Service 82fcde
# from being allocated in libc.so, which introduces evil dependencies
Packit Service 82fcde
# between libc.so and ld.so, which can make it impossible to upgrade.
Packit Service 82fcde
$(common-objpfx)libc_pic.os: $(common-objpfx)libc_pic.a
Packit Service 82fcde
	$(LINK.o) -nostdlib -nostartfiles -r -o $@ \
Packit Service 82fcde
	$(LDFLAGS-c_pic.os) -Wl,-d $(whole-archive) $^ -o $@
Packit Service 82fcde
Packit Service 82fcde
ifeq (,$(strip $(shlib-lds-flags)))
Packit Service 82fcde
# Generate a list of -R options to excise .gnu.glibc-stub.* sections.
Packit Service 82fcde
$(common-objpfx)libc_pic.opts: $(common-objpfx)libc_pic.os
Packit Service 82fcde
	$(OBJDUMP) -h $< | \
Packit Service 82fcde
	$(AWK) '$$2 ~ /\.gnu\.glibc-stub\./ { print "-R", $$2 }' \
Packit Service 82fcde
		> $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
# Apply those -R options.
Packit Service 82fcde
$(common-objpfx)libc_pic.os.clean: $(common-objpfx)libc_pic.opts \
Packit Service 82fcde
				   $(common-objpfx)libc_pic.os
Packit Service 82fcde
	$(OBJCOPY) @$^ $@
Packit Service 82fcde
generated += libc_pic.opts libc_pic.os.clean
Packit Service 82fcde
Packit Service 82fcde
libc_pic_clean := .clean
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Build a possibly-modified version of libc_pic.a for use in building
Packit Service 82fcde
# linkobj/libc.so.
Packit Service 82fcde
ifeq (,$(filter sunrpc,$(subdirs)))
Packit Service 82fcde
$(common-objpfx)linkobj/libc_pic.a: $(common-objpfx)libc_pic.a
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	ln -f $< $@
Packit Service 82fcde
else
Packit Service 82fcde
$(common-objpfx)linkobj/libc_pic.a: $(common-objpfx)libc_pic.a \
Packit Service 82fcde
				    $(common-objpfx)sunrpc/librpc_compat_pic.a
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	(cd $(common-objpfx)linkobj; \
Packit Service 82fcde
	 $(AR) x ../libc_pic.a; \
Packit Service 82fcde
	 rm $$($(AR) t ../sunrpc/librpc_compat_pic.a | sed 's/^compat-//'); \
Packit Service 82fcde
	 $(AR) x ../sunrpc/librpc_compat_pic.a; \
Packit Service 82fcde
	 $(AR) cr libc_pic.a *.os; \
Packit Service 82fcde
	 rm *.os)
Packit Service 82fcde
endif # $(subdirs) contains sunrpc
Packit Service 82fcde
Packit Service 82fcde
# Clear link-libc-deps for the libc.so libraries so build-shlibs does not
Packit Service 82fcde
# filter ld.so out of the list of linked objects.
Packit Service 82fcde
$(common-objpfx)libc.so: link-libc-deps = # empty
Packit Service 82fcde
$(common-objpfx)linkobj/libc.so: link-libc-deps = # empty
Packit Service 82fcde
Packit Service 82fcde
# Use our own special initializer and finalizer files for the libc.so
Packit Service 82fcde
# libraries.
Packit Service 82fcde
$(common-objpfx)libc.so: $(elf-objpfx)soinit.os \
Packit Service 82fcde
			 $(common-objpfx)libc_pic.os$(libc_pic_clean) \
Packit Service 82fcde
			 $(elf-objpfx)sofini.os \
Packit Service 82fcde
			 $(elf-objpfx)interp.os \
Packit Service 82fcde
			 $(elf-objpfx)ld.so \
Packit Service 82fcde
			 $(shlib-lds)
Packit Service 82fcde
	$(build-shlib)
Packit Service 82fcde
	$(call after-link,$@)
Packit Service 82fcde
Packit Service 82fcde
$(common-objpfx)linkobj/libc.so: $(elf-objpfx)soinit.os \
Packit Service 82fcde
			 $(common-objpfx)linkobj/libc_pic.a \
Packit Service 82fcde
			 $(elf-objpfx)sofini.os \
Packit Service 82fcde
			 $(elf-objpfx)interp.os \
Packit Service 82fcde
			 $(elf-objpfx)ld.so \
Packit Service 82fcde
			 $(shlib-lds)
Packit Service 82fcde
	$(build-shlib)
Packit Service 82fcde
	$(call after-link,$@)
Packit Service 82fcde
Packit Service 82fcde
ifeq ($(build-shared),yes)
Packit Service 82fcde
$(common-objpfx)libc.so: $(common-objpfx)libc.map
Packit Service 82fcde
endif
Packit Service 82fcde
common-generated += libc.so libc_pic.os
Packit Service 82fcde
ifdef libc.so-version
Packit Service 82fcde
$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
Packit Service 82fcde
	$(make-link)
Packit Service 82fcde
common-generated += libc.so$(libc.so-version)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
# Figure out the source filenames in this directory.
Packit Service 82fcde
Packit Service 82fcde
override sources := $(addsuffix .c,\
Packit Service 82fcde
			$(filter-out $(elided-routines),\
Packit Service 82fcde
			    $(routines) $(aux) \
Packit Service 82fcde
			    $(sysdep_routines)))
Packit Service 82fcde
sysdep_routines := $(sysdep_routines)
Packit Service 82fcde
Packit Service 82fcde
headers := $(headers) $(sysdep_headers)
Packit Service 82fcde
Packit Service 82fcde
# This is the list of all object files, gotten by
Packit Service 82fcde
# replacing every ".c" in `sources' with a ".o".
Packit Service 82fcde
override objects := $(addprefix $(objpfx),$(sources:.c=.o))
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
# The makefile may define $(extra-libs) with `libfoo libbar'
Packit Service 82fcde
# to build libfoo.a et al from the modules listed in $(libfoo-routines).
Packit Service 82fcde
ifdef extra-libs
Packit Service 82fcde
# extra-lib.mk is included once for each extra lib to define rules
Packit Service 82fcde
# to build it, and to add its objects to the various variables.
Packit Service 82fcde
# During its evaluation, $(lib) is set to the name of the library.
Packit Service 82fcde
extra-libs-left := $(extra-libs)
Packit Service 82fcde
include $(patsubst %,$(..)extra-lib.mk,$(extra-libs))
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
# The makefile may define $(modules-names) to build additional modules.
Packit Service 82fcde
# These are built with $(build-module), except any in $(modules-names-nobuild).
Packit Service 82fcde
# MODULE_NAME=extramodules, except any in $(modules-names-tests).
Packit Service 82fcde
ifdef modules-names
Packit Service 82fcde
cpp-srcs-left := $(filter-out $(modules-names-tests),$(modules-names))
Packit Service 82fcde
ifneq (,$(cpp-srcs-left))
Packit Service 82fcde
lib := extramodules
Packit Service 82fcde
include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifdef modules-names-tests
Packit Service 82fcde
cpp-srcs-left := $(filter $(modules-names-tests),$(modules-names))
Packit Service 82fcde
ifneq (,$(cpp-srcs-left))
Packit Service 82fcde
lib := testsuite
Packit Service 82fcde
include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
extra-modules-build := $(filter-out $(modules-names-nobuild),$(modules-names))
Packit Service 82fcde
$(extra-modules-build:%=$(objpfx)%.so): $(objpfx)%.so: \
Packit Service 82fcde
		$(objpfx)%.os $(shlib-lds) $(link-libs-deps)
Packit Service 82fcde
	$(build-module)
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
+depfiles := $(sources:.c=.d) \
Packit Service 82fcde
	     $(patsubst %.o,%.d,$(filter %.o,$(extra-objs:.os=.o))) \
Packit Service 82fcde
	     $(patsubst %.oS,%.d,$(filter %.oS,$(extra-objs))) \
Packit Service 82fcde
	     $(patsubst %.o,%.d,$(filter %.o,$(extra-test-objs:.os=.o))) \
Packit Service 82fcde
	     $(addsuffix .d,$(tests) $(tests-internal) $(xtests) $(test-srcs))
Packit Service 82fcde
ifeq ($(build-programs),yes)
Packit Service 82fcde
+depfiles += $(addsuffix .d,$(others) $(sysdep-others))
Packit Service 82fcde
endif
Packit Service 82fcde
+depfiles := $(addprefix $(objpfx),\
Packit Service 82fcde
			 $(filter-out $(addsuffix .d,$(omit-deps)),\
Packit Service 82fcde
				      $(+depfiles)))
Packit Service 82fcde
all-dt-files := $(foreach o,$(object-suffixes-for-libc),$(+depfiles:.d=$o.dt))
Packit Service 82fcde
+depfiles := $(patsubst %.dt,%.d,$(wildcard $(all-dt-files))) \
Packit Service 82fcde
	     $(wildcard $(all-dt-files:.dt=.d))
Packit Service 82fcde
Packit Service 82fcde
# This is a funny rule in that it removes its input file.
Packit Service 82fcde
%.d: %.dt
Packit Service 82fcde
	@sed $(sed-remove-objpfx) $< > $(@:.d=.T) && \
Packit Service 82fcde
	 mv -f $(@:.d=.T) $@ && \
Packit Service 82fcde
	 rm -f $<
Packit Service 82fcde
Packit Service 82fcde
# Avoid the .h.d files for any .sym files whose .h files don't exist yet.
Packit Service 82fcde
# They will be generated when they're needed, and trying too early won't work.
Packit Service 82fcde
+gen-as-const := $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
Packit Service 82fcde
+depfiles += $(addsuffix .d,$(filter $(wildcard $(+gen-as-const)),\
Packit Service 82fcde
						$(+gen-as-const)))
Packit Service 82fcde
Packit Service 82fcde
ifdef +depfiles
Packit Service 82fcde
ifneq ($(no_deps),t)
Packit Service 82fcde
-include $(+depfiles)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
# Maximize efficiency by minimizing the number of rules.
Packit Service 82fcde
.SUFFIXES:	# Clear the suffix list.  We don't use suffix rules.
Packit Service 82fcde
# Don't define any builtin rules.
Packit Service 82fcde
MAKEFLAGS := $(MAKEFLAGS)r
Packit Service 82fcde
Packit Service 82fcde
# Generic rule for making directories.
Packit Service 82fcde
%/:
Packit Service 82fcde
# mkdir isn't smart enough to strip a trailing /.
Packit Service 82fcde
# We always require a mkdir which supports the -p option to avoid error
Packit Service 82fcde
# messages in case of races.
Packit Service 82fcde
	mkdir -p $(@:%/=%)
Packit Service 82fcde

Packit Service 82fcde
# Make sure that object files are not removed
Packit Service 82fcde
# when they are intermediates between sources and library members.
Packit Service 82fcde
.PRECIOUS: $(addprefix $(objpfx)%,$(all-object-suffixes))
Packit Service 82fcde
Packit Service 82fcde
# Make sure that the parent library archive is never removed.
Packit Service 82fcde
.PRECIOUS: $(foreach l,$(libtypes),$(patsubst %,$(common-objpfx)$l,c))
Packit Service 82fcde

Packit Service 82fcde
# Use the verbose option of ar and tar when not running silently.
Packit Service 82fcde
ifeq	"$(findstring s,$(MAKEFLAGS))" ""	# if not -s
Packit Service 82fcde
verbose := v
Packit Service 82fcde
else	   					# -s
Packit Service 82fcde
verbose	:=
Packit Service 82fcde
endif						# not -s
Packit Service 82fcde
Packit Service 82fcde
ARFLAGS := r$(verbose)
Packit Service 82fcde
CREATE_ARFLAGS := cru$(verbose)
Packit Service 82fcde

Packit Service 82fcde
# This makes all the object files in the parent library archive.
Packit Service 82fcde
Packit Service 82fcde
.PHONY: lib lib-noranlib
Packit Service 82fcde
lib: lib-noranlib $(foreach l,$(libtypes),$(patsubst %,$(common-objpfx)$l,c))
Packit Service 82fcde
lib-noranlib: libobjs
Packit Service 82fcde
Packit Service 82fcde
# For object-suffix $o, the list of objects with that suffix.
Packit Service 82fcde
# Makefiles can define `elide-routines.so = foo' to leave foo.so out.
Packit Service 82fcde
o-objects = $(patsubst %.o,%$o,$(filter-out $(patsubst %,$(objpfx)%.o,\
Packit Service 82fcde
						       $(elide-routines$o)),\
Packit Service 82fcde
					    $(objects))) \
Packit Service 82fcde
	    $(addprefix $(objpfx),$(o-objects$o))
Packit Service 82fcde
Packit Service 82fcde
others: $(addprefix $(objpfx),$(install-lib))
Packit Service 82fcde
Packit Service 82fcde
ifndef objects
Packit Service 82fcde
Packit Service 82fcde
# Create the stamp$o files to keep the parent makefile happy.
Packit Service 82fcde
subdir_lib: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o)
Packit Service 82fcde
$(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o):
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	rm -f $@; > $@
Packit Service 82fcde
else
Packit Service 82fcde
Packit Service 82fcde
# Define explicit rules to update each $(objpfx)stamp.SUFFIX
Packit Service 82fcde
# timestamp file; these rules (one explicit rule is generated for each
Packit Service 82fcde
# object suffix) write a list of objects to update in the stamp file.
Packit Service 82fcde
# The parent will then actually add them all to the archive in the
Packit Service 82fcde
# archive rule, below.
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)stamp$o: $(o-objects); $$(do-stamp)
Packit Service 82fcde
endef
Packit Service 82fcde
define do-stamp
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
echo '$(patsubst $(objpfx)%,$(addsuffix /,$(subdir))%,$^)' > $@T
Packit Service 82fcde
mv -f $@T $@
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(object-suffixes-for-libc)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Now define explicit rules to build the library archives; these depend
Packit Service 82fcde
# on the stamp files built above.
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(common-objpfx)$(patsubst %,$(libtype$o),c): \
Packit Service 82fcde
		$(subdirs-stamp-o) $(common-objpfx)stamp$o; $$(do-makelib)
Packit Service 82fcde
endef
Packit Service 82fcde
define do-makelib
Packit Service 82fcde
cd $(common-objdir) && \
Packit Service 82fcde
$(AR) $(CREATE_ARFLAGS) $(@F) `cat $(patsubst $(common-objpfx)%,%,$^)`
Packit Service 82fcde
endef
Packit Service 82fcde
subdirs-stamps := $(foreach d,$(subdirs),$(common-objpfx)$d/stamp%)
Packit Service 82fcde
subdirs-stamp-o = $(subst %,$o,$(subdirs-stamps))
Packit Service 82fcde
ifndef subdir
Packit Service 82fcde
$(subdirs-stamps): subdir_lib;
Packit Service 82fcde
endif
Packit Service 82fcde
object-suffixes-left = $(object-suffixes-for-libc)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
# This makes all the object files.
Packit Service 82fcde
.PHONY: objects objs libobjs extra-objs
Packit Service 82fcde
objects objs: libobjs extra-objs
Packit Service 82fcde
libobjs: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o)
Packit Service 82fcde
extra-objs: $(addprefix $(objpfx),$(extra-objs))
Packit Service 82fcde
Packit Service 82fcde
# Canned sequence for building an extra library archive.
Packit Service 82fcde
define build-extra-lib
Packit Service 82fcde
$(patsubst %/,cd % &&,$(objpfx)) \
Packit Service 82fcde
$(AR) $(CREATE_ARFLAGS) $(@:$(objpfx)%=%) \
Packit Service 82fcde
      $(patsubst $(objpfx)%,%,$^)
Packit Service 82fcde
endef
Packit Service 82fcde

Packit Service 82fcde
# Installation.
Packit Service 82fcde
Packit Service 82fcde
.PHONY: force-install
Packit Service 82fcde
force-install:
Packit Service 82fcde
Packit Service 82fcde
# $(install-lib) are installed from the object directory into $(libdir);
Packit Service 82fcde
# files in $(install-lib) matching `lib%.a' are ranlib'd after installation
Packit Service 82fcde
# unless they also appear in $(non-lib.a).  $(install-data) are installed as
Packit Service 82fcde
# they are into $(datadir).  $(headers) are installed as they are in
Packit Service 82fcde
# $(includedir).  $(install-bin), $(install-bin-script) and $(install-sbin)
Packit Service 82fcde
# are installed from the object directory into $(bindir), $(bindir) and
Packit Service 82fcde
# $(sbindir), respectively.  $(install-others) and $(install-others-programs)
Packit Service 82fcde
# are absolute path names of files to install; rules to install them are
Packit Service 82fcde
# defined elsewhere.
Packit Service 82fcde
Packit Service 82fcde
# The simple library name to install libc.a under.
Packit Service 82fcde
# This could be defined by a sysdep Makefile.
Packit Service 82fcde
ifndef libc-name
Packit Service 82fcde
libc-name := c
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
define do-install
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
$(INSTALL_DATA) $< $@
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# Make the target directory if it doesn't exist, using the `mkinstalldirs'
Packit Service 82fcde
# script that does `mkdir -p' even if `mkdir' doesn't support that flag.
Packit Service 82fcde
define make-target-directory
Packit Service 82fcde
$(addprefix $(..)./scripts/mkinstalldirs ,\
Packit Service 82fcde
	    $(filter-out $(wildcard $(@D:%/=%)),$(@D:%/=%)))
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# Any directory (parent or subdir) should install libc.a; this way
Packit Service 82fcde
# "make install" in a subdir is guaranteed to install everything it changes.
Packit Service 82fcde
installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\
Packit Service 82fcde
			     $(inst_libdir)/$(patsubst %,$(libtype$o),\
Packit Service 82fcde
						     $(libprefix)$(libc-name)))
Packit Service 82fcde
Packit Service 82fcde
.PHONY: check-install-supported
Packit Service 82fcde
check-install-supported:
Packit Service 82fcde
Packit Service 82fcde
# Check to see if the prefix or exec_prefix GNU standard variable
Packit Service 82fcde
# has been overridden on the command line and, if so, fail with
Packit Service 82fcde
# an error message since doing so is not supported (set DESTDIR
Packit Service 82fcde
# instead).
Packit Service 82fcde
ifeq ($(origin prefix),command line)
Packit Service 82fcde
check-install-supported:
Packit Service 82fcde
	$(error Overriding prefix is not supported. Set DESTDIR instead.)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifeq ($(origin exec_prefix),command line)
Packit Service 82fcde
check-install-supported:
Packit Service 82fcde
	$(error Overriding exec_prefix is not supported. Set DESTDIR instead.)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
install: check-install-supported
Packit Service 82fcde
Packit Service 82fcde
install: $(installed-libcs)
Packit Service 82fcde
$(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force)
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	$(INSTALL_DATA) $(common-objpfx)lib$(*:$(libc-name)%=c%) $@
Packit Service 82fcde
Packit Service 82fcde
define do-install-program
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
$(INSTALL_PROGRAM) $< $@.new
Packit Service 82fcde
mv -f $@.new $@
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
define do-install-script
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
$(INSTALL_SCRIPT) $< $@.new
Packit Service 82fcde
mv -f $@.new $@
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
install-lib.so := $(filter %.so,$(install-lib:%_pic.a=%.so))
Packit Service 82fcde
install-lib := $(filter-out %.so %_pic.a,$(install-lib))
Packit Service 82fcde
Packit Service 82fcde
ifeq (yes,$(build-shared))
Packit Service 82fcde
# Find which .so's have versions.
Packit Service 82fcde
versioned := $(strip $(foreach so,$(install-lib.so),\
Packit Service 82fcde
			       $(patsubst %,$(so),$($(so)-version))))
Packit Service 82fcde
Packit Service 82fcde
install-lib.so-versioned := $(filter $(versioned), $(install-lib.so))
Packit Service 82fcde
install-lib.so-unversioned := $(filter-out $(versioned), $(install-lib.so))
Packit Service 82fcde
Packit Service 82fcde
# For versioned libraries, we install three files:
Packit Service 82fcde
#	$(inst_libdir)/libfoo.so	-- for linking, symlink or ld script
Packit Service 82fcde
#	$(inst_slibdir)/libfoo.so.NN	-- for loading by SONAME, symlink
Packit Service 82fcde
#	$(inst_slibdir)/libfoo-X.Y.Z.so -- the real shared object file
Packit Service 82fcde
lib-version := $(firstword $($(subdir)-version) $(version))
Packit Service 82fcde
install-lib-nosubdir: $(install-lib.so-unversioned:%=$(inst_slibdir)/%) \
Packit Service 82fcde
		      $(foreach L,$(install-lib.so-versioned),\
Packit Service 82fcde
				$(inst_libdir)/$L \
Packit Service 82fcde
				$(inst_slibdir)/$(L:.so=)-$(lib-version).so \
Packit Service 82fcde
				$(inst_slibdir)/$L$($L-version))
Packit Service 82fcde
Packit Service 82fcde
# Install all the unversioned shared libraries.
Packit Service 82fcde
$(install-lib.so-unversioned:%=$(inst_slibdir)/%): $(inst_slibdir)/%.so: \
Packit Service 82fcde
    $(objpfx)%.so $(+force)
Packit Service 82fcde
	$(do-install-program)
Packit Service 82fcde
Packit Service 82fcde
ifneq ($(findstring -s,$(LN_S)),)
Packit Service 82fcde
define make-link
Packit Service 82fcde
rm -f $@.new
Packit Service 82fcde
$(SHELL) $(..)scripts/rellns-sh $< $@.new
Packit Service 82fcde
mv -f $@.new $@
Packit Service 82fcde
endef
Packit Service 82fcde
define make-link-multidir
Packit Service 82fcde
$(patsubst %/,cd %,$(objpfx)); \
Packit Service 82fcde
  $(addprefix $(abspath $(..)scripts/mkinstalldirs) ,$(dir $(multidir))); \
Packit Service 82fcde
  $(LN_S) . $(multidir) 2> /dev/null; \
Packit Service 82fcde
  test -L $(multidir)
Packit Service 82fcde
endef
Packit Service 82fcde
else
Packit Service 82fcde
# If we have no symbolic links don't bother with rellns-sh.
Packit Service 82fcde
define make-link
Packit Service 82fcde
rm -f $@.new
Packit Service 82fcde
$(LN_S) $< $@.new
Packit Service 82fcde
mv -f $@.new $@
Packit Service 82fcde
endef
Packit Service 82fcde
define make-link-multidir
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
ln -f $(objpfx)/$(@F) $@
Packit Service 82fcde
endef
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifeq (yes,$(build-shared))
Packit Service 82fcde
ifeq (no,$(cross-compiling))
Packit Service 82fcde
symbolic-link-prog := $(elf-objpfx)sln
Packit Service 82fcde
symbolic-link-list := $(elf-objpfx)symlink.list
Packit Service 82fcde
define make-shlib-link
Packit Service 82fcde
echo `$(..)scripts/rellns-sh -p $< $@` $@ >> $(symbolic-link-list)
Packit Service 82fcde
endef
Packit Service 82fcde
else # cross-compiling
Packit Service 82fcde
# We need a definition that can be used by elf/Makefile's install rules.
Packit Service 82fcde
symbolic-link-prog = $(LN_S)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
ifndef make-shlib-link
Packit Service 82fcde
define make-shlib-link
Packit Service 82fcde
rm -f $@
Packit Service 82fcde
$(LN_S) `$(..)scripts/rellns-sh -p $< $@` $@
Packit Service 82fcde
endef
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifdef libc.so-version
Packit Service 82fcde
# For a library specified to be version N, install three files:
Packit Service 82fcde
# libc.so	->	libc.so.N	(e.g. libc.so.6)
Packit Service 82fcde
# libc.so.6	->	libc-VERSION.so	(e.g. libc-1.10.so)
Packit Service 82fcde
Packit Service 82fcde
$(inst_slibdir)/libc.so$(libc.so-version): $(inst_slibdir)/libc-$(version).so \
Packit Service 82fcde
					   $(+force)
Packit Service 82fcde
	$(make-shlib-link)
Packit Service 82fcde
$(inst_slibdir)/libc-$(version).so: $(common-objpfx)libc.so $(+force)
Packit Service 82fcde
	$(do-install-program)
Packit Service 82fcde
install: $(inst_slibdir)/libc.so$(libc.so-version)
Packit Service 82fcde
Packit Service 82fcde
# This fragment of linker script gives the OUTPUT_FORMAT statement
Packit Service 82fcde
# for the configuration we are building.  We put this statement into
Packit Service 82fcde
# the linker scripts we install for -lc et al so that they will not be
Packit Service 82fcde
# used by a link for a different format on a multi-architecture system.
Packit Service 82fcde
$(common-objpfx)format.lds: $(..)scripts/output-format.sed \
Packit Service 82fcde
			    $(common-objpfx)config.make \
Packit Service 82fcde
			    $(common-objpfx)config.h $(..)Makerules
Packit Service 82fcde
ifneq (unknown,$(output-format))
Packit Service 82fcde
	echo > $@.new 'OUTPUT_FORMAT($(output-format))'
Packit Service 82fcde
else
Packit Service 82fcde
	$(LINK.o) -shared $(sysdep-LDFLAGS) $(rtld-LDFLAGS) \
Packit Service 82fcde
		  $(LDFLAGS.so) $(LDFLAGS-lib.so) \
Packit Service 82fcde
		  -x c /dev/null -o $@.so -Wl,--verbose -v 2>&1 \
Packit Service 82fcde
	| sed -n -f $< > $@.new
Packit Service 82fcde
	test -s $@.new
Packit Service 82fcde
	rm -f $@.so
Packit Service 82fcde
endif
Packit Service 82fcde
	mv -f $@.new $@
Packit Service 82fcde
common-generated += format.lds
Packit Service 82fcde
Packit Service 82fcde
ifndef subdir
Packit Service 82fcde
# What we install as libc.so for programs to link against is in fact a
Packit Service 82fcde
# link script.  It contains references for the various libraries we need.
Packit Service 82fcde
# The libc.so object is not complete since some functions are only defined
Packit Service 82fcde
# in libc_nonshared.a.
Packit Service 82fcde
# We need to use absolute paths since otherwise local copies (if they exist)
Packit Service 82fcde
# of the files are taken by the linker.
Packit Service 82fcde
install: $(inst_libdir)/libc.so
Packit Service 82fcde
$(inst_libdir)/libc.so: $(common-objpfx)format.lds \
Packit Service 82fcde
			$(common-objpfx)libc.so$(libc.so-version) \
Packit Service 82fcde
			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
Packit Service 82fcde
						  $(libprefix)$(libc-name)) \
Packit Service 82fcde
			$(+force)
Packit Service 82fcde
	(echo '/* GNU ld script';\
Packit Service 82fcde
	 echo '   Use the shared library, but some functions are only in';\
Packit Service 82fcde
	 echo '   the static library, so try that secondarily.  */';\
Packit Service 82fcde
	 cat $<; \
Packit Service 82fcde
	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
Packit Service 82fcde
	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
Packit Service 82fcde
	      ' AS_NEEDED (' $(rtlddir)/$(rtld-installed-name) ') )' \
Packit Service 82fcde
	) > $@.new
Packit Service 82fcde
	mv -f $@.new $@
Packit Service 82fcde
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
else
Packit Service 82fcde
install: $(inst_slibdir)/libc.so
Packit Service 82fcde
$(inst_slibdir)/libc.so: $(common-objpfx)libc.so $(+force)
Packit Service 82fcde
	$(do-install-program)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifneq (,$(versioned))
Packit Service 82fcde
# Produce three sets of rules as above for all the smaller versioned libraries.
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(inst_libdir)/$o: $(inst_slibdir)/$o$($o-version) $(+force); $$(make-link)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(filter-out $(install-lib-ldscripts),$(versioned))
Packit Service 82fcde
ifneq (,$(object-suffixes-left))
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Make symlinks in the build directory, because the versioned names might
Packit Service 82fcde
# be referenced by a DT_NEEDED in another library.
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(objpfx)$o$($o-version): $(objpfx)$o; $$(make-link)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(versioned)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
generated += $(foreach o,$(versioned),$o$($o-version))
Packit Service 82fcde
Packit Service 82fcde
ifeq (,$($(subdir)-version))
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(inst_slibdir)/$o$($o-version): $(inst_slibdir)/$(o:.so=)-$(version).so \
Packit Service 82fcde
				 $(+force);
Packit Service 82fcde
	$$(make-shlib-link)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(versioned)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(inst_slibdir)/$(o:.so=)-$(version).so: $(objpfx)$o $(+force);
Packit Service 82fcde
	$$(do-install-program)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(versioned)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
else
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(inst_slibdir)/$o$($o-version): \
Packit Service 82fcde
  $(inst_slibdir)/$(o:.so=)-$($(subdir)-version).so $(+force);
Packit Service 82fcde
	$$(make-shlib-link)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(versioned)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
Packit Service 82fcde
define o-iterator-doit
Packit Service 82fcde
$(inst_slibdir)/$(o:.so=)-$($(subdir)-version).so: $(objpfx)$o $(+force);
Packit Service 82fcde
	$$(do-install-program)
Packit Service 82fcde
endef
Packit Service 82fcde
object-suffixes-left := $(versioned)
Packit Service 82fcde
include $(o-iterator)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
define do-install-so
Packit Service 82fcde
$(do-install-program)
Packit Service 82fcde
$(patsubst %,$(LN_S) -f $(@F) \
Packit Service 82fcde
			$(@D)/$(patsubst %$*.so,%,$(
Packit Service 82fcde
	   $(filter-out %.so,$@))
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
so-versions := $(sort $(foreach so,$(install-lib.so),.so$($(so)-version)))
Packit Service 82fcde
$(foreach v,$(so-versions),\
Packit Service 82fcde
	  $(inst_slibdir)/lib$(libprefix)%$v): $(common-objpfx)lib%.so \
Packit Service 82fcde
					       $(+force)
Packit Service 82fcde
	$(do-install-so)
Packit Service 82fcde
$(foreach v,$(so-versions),\
Packit Service 82fcde
	  $(inst_slibdir)/$(libprefix)%$v): $(common-objpfx)%.so $(+force)
Packit Service 82fcde
	$(do-install-so)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifdef install-bin
Packit Service 82fcde
$(addprefix $(inst_bindir)/,$(install-bin)): \
Packit Service 82fcde
    $(inst_bindir)/%: $(objpfx)% $(+force)
Packit Service 82fcde
	$(do-install-program)
Packit Service 82fcde
endif
Packit Service 82fcde
ifdef install-bin-script
Packit Service 82fcde
$(addprefix $(inst_bindir)/,$(install-bin-script)): \
Packit Service 82fcde
    $(inst_bindir)/%: $(objpfx)% $(+force)
Packit Service 82fcde
	$(do-install-script)
Packit Service 82fcde
endif
Packit Service 82fcde
ifdef install-rootsbin
Packit Service 82fcde
$(addprefix $(inst_rootsbindir)/,$(install-rootsbin)): \
Packit Service 82fcde
   $(inst_rootsbindir)/%: $(objpfx)% $(+force)
Packit Service 82fcde
	$(do-install-program)
Packit Service 82fcde
endif
Packit Service 82fcde
ifdef install-sbin
Packit Service 82fcde
$(addprefix $(inst_sbindir)/,$(install-sbin)): \
Packit Service 82fcde
    $(inst_sbindir)/%: $(objpfx)% $(+force)
Packit Service 82fcde
	$(do-install-program)
Packit Service 82fcde
endif
Packit Service 82fcde
ifdef install-lib
Packit Service 82fcde
install-lib.a := $(filter lib%.a,$(install-lib))
Packit Service 82fcde
install-lib.a := $(filter-out $(install-lib-ldscripts),$(install-lib.a))
Packit Service 82fcde
install-lib-non.a := $(filter-out lib%.a,$(install-lib))
Packit Service 82fcde
ifdef install-lib-non.a
Packit Service 82fcde
$(addprefix $(inst_libdir)/$(libprefix),$(install-lib-non.a)): \
Packit Service 82fcde
  $(inst_libdir)/$(libprefix)%: $(objpfx)% $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
endif
Packit Service 82fcde
ifdef install-lib.a
Packit Service 82fcde
$(install-lib.a:lib%.a=$(inst_libdir)/lib$(libprefix)%.a): \
Packit Service 82fcde
  $(inst_libdir)/lib$(libprefix)%.a: $(objpfx)lib%.a $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
ifdef install-data
Packit Service 82fcde
$(addprefix $(inst_datadir)/,$(install-data)): $(inst_datadir)/%: % $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
endif
Packit Service 82fcde
headers := $(strip $(headers))
Packit Service 82fcde
ifdef headers
Packit Service 82fcde
# This implicit rule installs headers from the source directory.
Packit Service 82fcde
# It may be ignored in preference to rules from sysd-rules to find
Packit Service 82fcde
# headers in the sysdeps tree.
Packit Service 82fcde
$(inst_includedir)/%.h: $(objpfx)%.h $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
$(inst_includedir)/%.h: $(common-objpfx)%.h $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
$(inst_includedir)/%.h: %.h $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
$(inst_includedir)/%.h: $(..)include/%.h $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
headers-nonh := $(filter-out %.h,$(headers))
Packit Service 82fcde
ifdef headers-nonh
Packit Service 82fcde
$(addprefix $(inst_includedir)/,$(headers-nonh)): $(inst_includedir)/%: \
Packit Service 82fcde
						 % $(+force)
Packit Service 82fcde
	$(do-install)
Packit Service 82fcde
endif	# headers-nonh
Packit Service 82fcde
endif	# headers
Packit Service 82fcde
Packit Service 82fcde
.PHONY: install-bin-nosubdir install-bin-script-nosubdir \
Packit Service 82fcde
	install-rootsbin-nosubdir install-sbin-nosubdir install-lib-nosubdir \
Packit Service 82fcde
	install-data-nosubdir install-headers-nosubdir
Packit Service 82fcde
install-bin-nosubdir: $(addprefix $(inst_bindir)/,$(install-bin))
Packit Service 82fcde
install-bin-script-nosubdir: $(addprefix $(inst_bindir)/,$(install-bin-script))
Packit Service 82fcde
install-rootsbin-nosubdir: \
Packit Service 82fcde
	$(addprefix $(inst_rootsbindir)/,$(install-rootsbin))
Packit Service 82fcde
install-sbin-nosubdir: $(addprefix $(inst_sbindir)/,$(install-sbin))
Packit Service 82fcde
install-lib-nosubdir: $(addprefix $(inst_libdir)/,\
Packit Service 82fcde
		       $(patsubst lib%.a,lib$(libprefix)%.a,$(install-lib.a)) \
Packit Service 82fcde
		       $(addprefix $(libprefix),$(install-lib-non.a)))
Packit Service 82fcde
install-data-nosubdir: $(addprefix $(inst_datadir)/,$(install-data))
Packit Service 82fcde
install-headers-nosubdir: $(addprefix $(inst_includedir)/,$(headers))
Packit Service 82fcde
install-others-nosubdir: $(install-others)
Packit Service 82fcde
install-others-programs-nosubdir: $(install-others-programs)
Packit Service 82fcde
Packit Service 82fcde
# We need all the `-nosubdir' targets so that `install' in the parent
Packit Service 82fcde
# doesn't depend on several things which each iterate over the subdirs.
Packit Service 82fcde
# This rule makes `install-FOO' always use `install-FOO-nosubdir' as a
Packit Service 82fcde
# subroutine.  Then in the parent `install-FOO' also causes subdir makes.
Packit Service 82fcde
install-%:: install-%-nosubdir ;
Packit Service 82fcde
Packit Service 82fcde
.PHONY: install install-no-libc.a-nosubdir
Packit Service 82fcde
install-no-libc.a-nosubdir: install-headers-nosubdir install-data-nosubdir \
Packit Service 82fcde
			    install-lib-nosubdir install-others-nosubdir
Packit Service 82fcde
ifeq ($(build-programs),yes)
Packit Service 82fcde
install-no-libc.a-nosubdir: install-bin-nosubdir install-bin-script-nosubdir \
Packit Service 82fcde
			    install-rootsbin-nosubdir install-sbin-nosubdir \
Packit Service 82fcde
			    install-others-programs-nosubdir
Packit Service 82fcde
endif
Packit Service 82fcde
install: install-no-libc.a-nosubdir
Packit Service 82fcde

Packit Service 82fcde
# Command to compile $< using the native libraries.
Packit Service 82fcde
define native-compile
Packit Service 82fcde
$(make-target-directory)
Packit Service 82fcde
$(BUILD_CC) $($(basename $(
Packit Service 82fcde
	    $< $(OUTPUT_OPTION) $(BUILD_LDFLAGS)
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# We always want to use configuration definitions.
Packit Service 82fcde
ALL_BUILD_CFLAGS = $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -D_GNU_SOURCE \
Packit Service 82fcde
		   -DIS_IN_build -include $(common-objpfx)config.h
Packit Service 82fcde
Packit Service 82fcde
# Support the GNU standard name for this target.
Packit Service 82fcde
.PHONY: check
Packit Service 82fcde
check: tests
Packit Service 82fcde
# Special target to run tests which cannot be run unconditionally.
Packit Service 82fcde
# Maintainers should use this target.
Packit Service 82fcde
.PHONY: xcheck
Packit Service 82fcde
xcheck: xtests
Packit Service 82fcde
Packit Service 82fcde
# The only difference between MODULE_NAME=testsuite and MODULE_NAME=nonlib is
Packit Service 82fcde
# that almost all internal declarations from config.h, libc-symbols.h, and
Packit Service 82fcde
# include/*.h are not available to 'testsuite' code, but are to 'nonlib' code.
Packit Service 853ad1
all-testsuite := $(strip $(tests) $(xtests) $(test-srcs) $(test-extras) \
Packit Service 853ad1
		 $(tests-container))
Packit Service 82fcde
ifneq (,$(all-testsuite))
Packit Service 82fcde
cpp-srcs-left = $(all-testsuite)
Packit Service 82fcde
lib := testsuite
Packit Service 82fcde
include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
all-nonlib := $(strip $(tests-internal) $(test-internal-extras) \
Packit Service 82fcde
		      $(others) $(others-extras))
Packit Service 82fcde
ifneq (,$(all-nonlib))
Packit Service 82fcde
cpp-srcs-left = $(all-nonlib)
Packit Service 82fcde
lib := nonlib
Packit Service 82fcde
include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
ifeq ($(build-shared),yes)
Packit Service 82fcde
# Generate normalized lists of symbols, versions, and data sizes.
Packit Service 82fcde
# This is handy for checking against existing library binaries.
Packit Service 82fcde
Packit Service 82fcde
%.symlist: $(..)scripts/abilist.awk %.dynsym
Packit Service 82fcde
	LC_ALL=C $(AWK) -f $^ > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
Packit Service 82fcde
%.dynsym: %.so
Packit Service 82fcde
	LC_ALL=C $(OBJDUMP) --dynamic-syms $< > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
Packit Service 82fcde
# A sysdeps/.../Makefile can set abilist-pattern to something like
Packit Service 82fcde
# %-foo.abilist to look for libc-foo.abilist instead of libc.abilist.
Packit Service 82fcde
# This makes sense if multiple ABIs can be most cleanly supported by a
Packit Service 82fcde
# configuration without using separate sysdeps directories for each.
Packit Service 82fcde
ifdef abilist-pattern
Packit Service 82fcde
vpath $(abilist-pattern) $(+sysdep_dirs)
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
vpath %.abilist $(+sysdep_dirs)
Packit Service 82fcde
Packit Service 82fcde
# The .PRECIOUS rule prevents the files built by an implicit rule whose
Packit Service 82fcde
# target pattern is %.symlist from being considered "intermediate files"
Packit Service 82fcde
# and automatically removed.  We only want these files to be removed by
Packit Service 82fcde
# 'make clean', which is handled by the 'generated' variable.
Packit Service 82fcde
.PRECIOUS: %.symlist
Packit Service 82fcde
generated += $(extra-libs:=.symlist)
Packit Service 82fcde
Packit Service 82fcde
ifdef abilist-pattern
Packit Service 82fcde
$(objpfx)check-abi-%.out: $(common-objpfx)config.make $(abilist-pattern) \
Packit Service 82fcde
			  $(objpfx)%.symlist
Packit Service 82fcde
	$(check-abi-pattern); \
Packit Service 82fcde
	$(evaluate-test)
Packit Service 82fcde
$(objpfx)check-abi-%.out: $(common-objpfx)config.make $(abilist-pattern) \
Packit Service 82fcde
			  $(common-objpfx)%.symlist
Packit Service 82fcde
	$(check-abi-pattern); \
Packit Service 82fcde
	$(evaluate-test)
Packit Service 82fcde
endif
Packit Service 82fcde
$(objpfx)check-abi-%.out: $(common-objpfx)config.make %.abilist \
Packit Service 82fcde
			  $(objpfx)%.symlist
Packit Service 82fcde
	$(check-abi); \
Packit Service 82fcde
	$(evaluate-test)
Packit Service 82fcde
$(objpfx)check-abi-%.out: $(common-objpfx)config.make %.abilist \
Packit Service 82fcde
			  $(common-objpfx)%.symlist
Packit Service 82fcde
	$(check-abi); \
Packit Service 82fcde
	$(evaluate-test)
Packit Service 82fcde
define check-abi-pattern
Packit Service 82fcde
	diff -p -U 0 $(filter $(abilist-pattern),$^) $(filter %.symlist,$^) \
Packit Service 82fcde
	     > $@
Packit Service 82fcde
endef
Packit Service 82fcde
define check-abi
Packit Service 82fcde
	diff -p -U 0 $(filter %.abilist,$^) $(filter %.symlist,$^) > $@
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
ifdef abilist-pattern
Packit Service 82fcde
update-abi-%: $(objpfx)%.symlist $(abilist-pattern)
Packit Service 82fcde
	$(update-abi-pattern)
Packit Service 82fcde
update-abi-%: $(common-objpfx)%.symlist $(abilist-pattern)
Packit Service 82fcde
	$(update-abi-pattern)
Packit Service 82fcde
endif
Packit Service 82fcde
update-abi-%: $(objpfx)%.symlist %.abilist
Packit Service 82fcde
	$(update-abi)
Packit Service 82fcde
update-abi-%: $(common-objpfx)%.symlist %.abilist
Packit Service 82fcde
	$(update-abi)
Packit Service 82fcde
define update-abi-pattern
Packit Service 82fcde
@if cmp -s $^ 2> /dev/null; \
Packit Service 82fcde
 then \
Packit Service 82fcde
      echo '+++ $(filter $(abilist-pattern),$^) is unchanged'; \
Packit Service 82fcde
 else cp -f $^; \
Packit Service 82fcde
      echo '*** Now check $(filter $(abilist-pattern),$^) changes for correctness ***'; \
Packit Service 82fcde
 fi
Packit Service 82fcde
endef
Packit Service 82fcde
define update-abi
Packit Service 82fcde
@if cmp -s $^ 2> /dev/null; \
Packit Service 82fcde
 then \
Packit Service 82fcde
      echo '+++ $(filter %.abilist,$^) is unchanged'; \
Packit Service 82fcde
 else cp -f $^; \
Packit Service 82fcde
      echo '*** Now check $(filter %.abilist,$^) changes for correctness ***'; \
Packit Service 82fcde
 fi
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# Patch all .abilist files for one DSO.  The find command locates
Packit Service 82fcde
# abilist files for all architectures.  The regular expression in the
Packit Service 82fcde
# find invocation is needed to separate libc.abilist and
Packit Service 82fcde
# libcrypt.abilist, for example.  It assumes that abilist-pattern, if
Packit Service 82fcde
# set, is of the form "%-SUFFIX", and not "%SUFFIX", that is, there is
Packit Service 82fcde
# a non-alphanumeric seperator between the pattern and the suffix
Packit Service 82fcde
# added.  The abilist files in /generic/ are filtered out because
Packit Service 82fcde
# these are expected to remain empty.
Packit Service 82fcde
define update-all-abi
Packit Service 82fcde
$(SHELL) $(..)scripts/update-abilist.sh $^ \
Packit Service 82fcde
  $$(find $(..)sysdeps \
Packit Service 82fcde
    -regextype posix-egrep -regex '.*/$*([^a-z0-9].*)?\.abilist$$' \
Packit Service 82fcde
    \! -regex '.*/generic/.*')
Packit Service 82fcde
endef
Packit Service 82fcde
ifdef abilist-pattern
Packit Service 82fcde
update-all-abi-%: $(abilist-pattern) $(objpfx)%.symlist
Packit Service 82fcde
	$(update-all-abi)
Packit Service 82fcde
update-all-abi-%: $(abilist-pattern) $(common-objpfx)%.symlist
Packit Service 82fcde
	$(update-all-abi)
Packit Service 82fcde
endif
Packit Service 82fcde
update-all-abi-%: %.abilist $(objpfx)%.symlist
Packit Service 82fcde
	$(update-all-abi)
Packit Service 82fcde
update-all-abi-%: %.abilist $(common-objpfx)%.symlist
Packit Service 82fcde
	$(update-all-abi)
Packit Service 82fcde
Packit Service 82fcde
.PHONY: update-abi update-all-abi check-abi
Packit Service 82fcde
update-abi: $(patsubst %.so,update-abi-%,$(install-lib.so-versioned))
Packit Service 82fcde
update-all-abi: $(patsubst %.so,update-all-abi-%,$(install-lib.so-versioned))
Packit Service 82fcde
check-abi-list = $(patsubst %.so,$(objpfx)check-abi-%.out, \
Packit Service 82fcde
				 $(install-lib.so-versioned))
Packit Service 82fcde
check-abi: $(check-abi-list)
Packit Service 82fcde
ifdef subdir
Packit Service 82fcde
subdir_check-abi: check-abi
Packit Service 82fcde
subdir_update-abi: update-abi
Packit Service 82fcde
subdir_update-all-abi: update-all-abi
Packit Service 82fcde
else
Packit Service 82fcde
check-abi: subdir_check-abi
Packit Service 82fcde
	if grep -q '^FAIL:' $(objpfx)*/check-abi*.test-result; then \
Packit Service 82fcde
		cat $(objpfx)*/check-abi*.out && exit 1; fi
Packit Service 82fcde
update-abi: subdir_update-abi
Packit Service 82fcde
update-all-abi: subdir_update-all-abi
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifeq ($(subdir),elf)
Packit Service 82fcde
check-abi: $(objpfx)check-abi-libc.out
Packit Service 82fcde
tests-special += $(objpfx)check-abi-libc.out
Packit Service 82fcde
update-abi: update-abi-libc
Packit Service 82fcde
update-all-abi: update-all-abi-libc
Packit Service 82fcde
common-generated += libc.symlist
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
ifeq ($(build-shared),yes)
Packit Service 82fcde
ifdef subdir
Packit Service 82fcde
tests-special += $(check-abi-list)
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
# These will have been set by sysdeps/posix/Makefile.
Packit Service 82fcde
L_tmpnam  ?= 1
Packit Service 82fcde
TMP_MAX   ?= 0
Packit Service 82fcde
L_ctermid ?= 1
Packit Service 82fcde
L_cuserid ?= 1
Packit Service 82fcde
Packit Service 82fcde
stdio_lim = $(common-objpfx)bits/stdio_lim.h
Packit Service 82fcde
Packit Service 82fcde
$(stdio_lim:lim.h=%.h) $(stdio_lim:lim.h=%.d): $(stdio_lim:lim.h=%.st); @:
Packit Service 82fcde
$(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
Packit Service 82fcde
		   $(common-objpfx)config.make
Packit Service 82fcde
	$(make-target-directory)
Packit Service 82fcde
	{ echo '#include "$(..)posix/bits/posix1_lim.h"';		\
Packit Service 82fcde
	} |								\
Packit Service 82fcde
	$(CC) -E -dM -MD -MP -MF $(@:st=dT) -MT '$(@:st=h) $(@:st=d)' 	\
Packit Service 82fcde
	      $(CPPUNDEFS) $(+includes) -xc - -o $(@:st=hT)
Packit Service 82fcde
	sed $(sed-remove-objpfx) $(sed-remove-dotdot)			\
Packit Service 82fcde
	    $(@:st=dT) > $(@:st=dt)
Packit Service 82fcde
	mv -f $(@:st=dt) $(@:st=d)
Packit Service 82fcde
	fopen_max=`sed -n 's/^#define OPEN_MAX //1p' $(@:st=hT)`; 	\
Packit Service 82fcde
	filename_max=`sed -n 's/^#define PATH_MAX //1p' $(@:st=hT)`;	\
Packit Service 82fcde
	fopen_max=$${fopen_max:-16};					\
Packit Service 82fcde
	filename_max=$${filename_max:-1024};				\
Packit Service 82fcde
	sed -e "s/@FOPEN_MAX@/$$fopen_max/"				\
Packit Service 82fcde
	    -e "s/@FILENAME_MAX@/$$filename_max/"			\
Packit Service 82fcde
	    -e "s/@L_tmpnam@/$(L_tmpnam)/"				\
Packit Service 82fcde
	    -e "s/@TMP_MAX@/$(TMP_MAX)/"				\
Packit Service 82fcde
	    -e "s/@L_ctermid@/$(L_ctermid)/"				\
Packit Service 82fcde
	    -e "s/@L_cuserid@/$(L_cuserid)/"				\
Packit Service 82fcde
	    $< > $(@:st=h.new)
Packit Service 82fcde
	$(move-if-change) $(@:st=h.new) $(@:st=h)
Packit Service 82fcde
# Remove these last so that they can be examined if something went wrong.
Packit Service 82fcde
	rm -f $(@:st=hT) $(@:st=dT) $(@:st=dt)
Packit Service 82fcde
	touch $@
Packit Service 82fcde
# Get dependencies.
Packit Service 82fcde
ifndef no_deps
Packit Service 82fcde
-include $(stdio_lim:h=d)
Packit Service 82fcde
endif
Packit Service 82fcde
common-generated += bits/stdio_lim.h bits/stdio_lim.d bits/stdio_lim.st
Packit Service 82fcde

Packit Service 82fcde
FORCE:
Packit Service 82fcde
Packit Service 82fcde
.PHONY: echo-headers
Packit Service 82fcde
echo-headers:
Packit Service 82fcde
	@echo $(headers)
Packit Service 82fcde
Packit Service 82fcde
%.bz2: %; bzip2 -9vk $<
Packit Service 82fcde
%.gz: %; gzip -9vnc $< > $@.new && mv -f $@.new $@
Packit Service 82fcde
%.xz: %; xz -9evk $<
Packit Service 82fcde

Packit Service 82fcde
# Common cleaning targets.
Packit Service 82fcde
Packit Service 82fcde
.PHONY: common-mostlyclean common-clean mostlyclean clean do-tests-clean
Packit Service 82fcde
clean: common-clean
Packit Service 82fcde
mostlyclean: common-mostlyclean
Packit Service 82fcde
Packit Service 82fcde
do-tests-clean:
Packit Service 82fcde
	-rm -f $(addprefix $(objpfx),$(addsuffix .out,$(tests) \
Packit Service 82fcde
						      $(tests-internal) \
Packit Service 82fcde
						      $(xtests) \
Packit Service 82fcde
						      $(test-srcs)) \
Packit Service 82fcde
				     $(addsuffix .test-result,$(tests) \
Packit Service 82fcde
							      $(tests-internal) \
Packit Service 82fcde
							      $(xtests) \
Packit Service 82fcde
							      $(test-srcs)))
Packit Service 82fcde
Packit Service 82fcde
# Remove the object files.
Packit Service 82fcde
common-mostlyclean:
Packit Service 82fcde
	-rm -f $(addprefix $(objpfx),$(tests) $(tests-internal) $(xtests) \
Packit Service 82fcde
				     $(test-srcs) \
Packit Service 82fcde
				     $(others) $(sysdep-others) stubs \
Packit Service 82fcde
				     $(addsuffix .o,$(tests) \
Packit Service 82fcde
						    $(tests-internal) \
Packit Service 82fcde
						    $(xtests) \
Packit Service 82fcde
						    $(test-srcs) \
Packit Service 82fcde
						    $(others) \
Packit Service 82fcde
						    $(sysdep-others)) \
Packit Service 82fcde
				     $(addsuffix .out,$(tests) \
Packit Service 82fcde
						      $(tests-internal) \
Packit Service 82fcde
						      $(xtests) \
Packit Service 82fcde
						      $(test-srcs)) \
Packit Service 82fcde
				     $(addsuffix .test-result,$(tests) \
Packit Service 82fcde
							      $(tests-internal) \
Packit Service 82fcde
							      $(xtests) \
Packit Service 82fcde
							      $(test-srcs)))
Packit Service 82fcde
	-rm -f $(addprefix $(objpfx),$(extra-objs) $(extra-test-objs) \
Packit Service 82fcde
				     $(install-lib) $(install-lib.so) \
Packit Service 82fcde
				     $(install-lib.so:%.so=%_pic.a))
Packit Service 82fcde
	-rm -f core
Packit Service 82fcde
	-rm -f $(objpfx)rtld-*.os
Packit Service 82fcde
	$(rmobjs)
Packit Service 82fcde
define rmobjs
Packit Service 82fcde
$(foreach o,$(object-suffixes-for-libc),
Packit Service 82fcde
-rm -f $(objpfx)stamp$o $(o-objects))
Packit Service 82fcde
endef
Packit Service 82fcde
Packit Service 82fcde
# Also remove the dependencies and generated source files.
Packit Service 82fcde
common-clean: common-mostlyclean
Packit Service 82fcde
	-rm -f $(addprefix $(objpfx),$(generated))
Packit Service 82fcde
	-rm -f $(objpfx)*.d $(objpfx)*.dt
Packit Service 82fcde
	-rm -fr $(addprefix $(objpfx),$(generated-dirs))
Packit Service 82fcde
	-rm -f $(addprefix $(common-objpfx),$(common-generated))
Packit Service 82fcde
	-rm -f $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
Packit Service 82fcde

Packit Service 82fcde
# Produce a file `stubs' which contains `#define __stub_FUNCTION'
Packit Service 82fcde
# for each function which is a stub.
Packit Service 82fcde
Packit Service 82fcde
ifdef objpfx
Packit Service 82fcde
.PHONY: stubs # The parent Makefile calls this target.
Packit Service 82fcde
stubs: $(objpfx)stubs
Packit Service 82fcde
endif
Packit Service 82fcde
objs-for-stubs := $(foreach o,$(object-suffixes-for-libc),$(o-objects)) \
Packit Service 82fcde
		  $(addprefix $(objpfx),$(extra-objs))
Packit Service 82fcde
$(objpfx)stubs: $(objs-for-stubs)
Packit Service 82fcde
ifneq (,$(strip $(objs-for-stubs)))
Packit Service 82fcde
	(cd $(objpfx).; $(OBJDUMP) -h $(patsubst $(objpfx)%,%,$^)) | \
Packit Service 82fcde
	$(AWK) '/\.gnu\.glibc-stub\./ { \
Packit Service 82fcde
		  sub(/\.gnu\.glibc-stub\./, "", $$2); \
Packit Service 82fcde
		  stubs[$$2] = 1; } \
Packit Service 82fcde
		END { for (s in stubs) print "#define __stub_" s }' > $@T
Packit Service 82fcde
	mv -f $@T $@
Packit Service 82fcde
else
Packit Service 82fcde
	> $@
Packit Service 82fcde
endif
Packit Service 82fcde

Packit Service 82fcde
ifneq (,$(strip $(gpl2lgpl)))
Packit Service 82fcde
ifneq (,$(wildcard $(..)gpl2lgpl.sed))
Packit Service 82fcde
# Snarf from the master source and frob the copying notice.
Packit Service 82fcde
$(gpl2lgpl): %: $(..)gpl2lgpl.sed /home/gd/gnu/lib/%
Packit Service 82fcde
	sed -f $^ > $@-tmp
Packit Service 82fcde
# So I don't edit them by mistake.
Packit Service 82fcde
	chmod a-w $@-tmp
Packit Service 82fcde
	mv -f $@-tmp $@
Packit Service 82fcde
endif
Packit Service 82fcde
endif
Packit Service 82fcde
Packit Service 82fcde
# Local Variables:
Packit Service 82fcde
# mode: makefile
Packit Service 82fcde
# End: