X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Makefile;h=ac1125853bf692c4b631f97ba2b38bf2bde02067;hb=9681c61f11d08f757398c5fb74d676db3e78a576;hp=8f1223b91b61b620d31a34795314a241d50040ee;hpb=14eb5d5d3417d7c7f38b34270713d4969e0f4111;p=thirdparty%2Fglibc.git diff --git a/Makefile b/Makefile index 8f1223b91b6..ac1125853bf 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,19 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. +# Copyright (C) 1991-2019 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. # The GNU C Library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. +# Lesser General Public License for more details. -# You should have received a copy of the GNU Library General Public -# License along with the GNU C Library; see the file COPYING.LIB. If not, -# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# . # # Master Makefile for the GNU C library @@ -30,38 +29,39 @@ include Makeconfig .PHONY: all all: lib others -ifeq ($(with-cvs),yes) -define autoconf-it -@-rm -f $@.new -autoconf $(ACFLAGS) $< > $@.new -chmod a-w,a+x $@.new -mv -f $@.new $@ -test ! -d CVS || cvs $(CVSOPTS) commit -m'Regenerated: autoconf $(ACFLAGS) $<' $@ -endef -else +ifneq ($(AUTOCONF),no) + define autoconf-it @-rm -f $@.new -autoconf $(ACFLAGS) $< > $@.new -chmod a-w,a+x $@.new +$(AUTOCONF) $(ACFLAGS) $< > $@.new +chmod a-w$(patsubst %,$(comma)a+x,$(filter .,$(@D))) $@.new mv -f $@.new $@ endef -endif -configure: configure.in aclocal.m4; $(autoconf-it) -%/configure: %/configure.in aclocal.m4; $(autoconf-it) +configure: configure.ac aclocal.m4; $(autoconf-it) +%/configure: %/configure.ac aclocal.m4; $(autoconf-it) +%/preconfigure: %/preconfigure.ac aclocal.m4; $(autoconf-it) + +endif # $(AUTOCONF) = no + + +# We don't want to run anything here in parallel. +.NOTPARALLEL: # These are the targets that are made by making them in each subdirectory. +subdir_targets := subdir_lib objects objs others subdir_mostlyclean \ subdir_clean subdir_distclean subdir_realclean \ - tests subdir_lint.out \ - subdir_distinfo \ - subdir_echo-headers subdir_echo-distinfo \ + tests xtests \ + subdir_update-abi subdir_check-abi \ + subdir_update-all-abi \ + subdir_echo-headers \ subdir_install \ + subdir_objs subdir_stubs subdir_testclean \ $(addprefix install-, no-libc.a bin lib data headers others) -headers := errno.h sys/errno.h bits/errno.h limits.h values.h \ - features.h gnu-versions.h bits/libc-lock.h bits/xopen_lim.h \ - gnu/libc-version.h +headers := limits.h values.h features.h gnu-versions.h \ + bits/xopen_lim.h gnu/libc-version.h stdc-predef.h \ + bits/libc-header-start.h echo-headers: subdir_echo-headers @@ -71,21 +71,24 @@ vpath %.h $(subdir-dirs) # What to install. install-others = $(inst_includedir)/gnu/stubs.h -install-bin = glibcbug +install-bin-script = ifeq (yes,$(build-shared)) -install-others += $(inst_includedir)/gnu/lib-names.h +headers += gnu/lib-names.h endif include Makerules ifeq ($(build-programs),yes) -others: $(addprefix $(objpfx),$(install-bin)) +others: $(addprefix $(objpfx),$(install-bin-script)) endif # Install from subdirectories too. install: subdir_install +# Explicit dependency so that `make install-headers' works +install-headers: install-headers-nosubdir + # Make sure that the dynamic linker is installed before libc. $(inst_slibdir)/libc-$(version).so: elf/ldso_install @@ -93,7 +96,7 @@ $(inst_slibdir)/libc-$(version).so: elf/ldso_install elf/ldso_install: $(MAKE) -C $(@D) $(@F) -# Create links for shared libraries using the `ldconfig' program is possible. +# Create links for shared libraries using the `ldconfig' program if possible. # Ignore the error if we cannot update /etc/ld.so.cache. ifeq (no,$(cross-compiling)) ifeq (yes,$(build-shared)) @@ -104,12 +107,13 @@ install-symbolic-link: subdir_install rm -f $(symbolic-link-list) install: - -test ! -x $(common-objpfx)elf/ldconfig || \ - $(common-objpfx)elf/ldconfig -d $(inst_slibdir) $(inst_libdir) + -test ! -x $(elf-objpfx)ldconfig || LC_ALL=C \ + $(elf-objpfx)ldconfig $(addprefix -r ,$(install_root)) \ + $(slibdir) $(libdir) ifneq (no,$(PERL)) ifeq (/usr,$(prefix)) ifeq (,$(install_root)) - CC="$(CC)" $(PERL) scripts/test-installation.pl $(common-objpfx) + LD_SO=$(ld.so-version) CC="$(CC)" $(PERL) scripts/test-installation.pl $(common-objpfx) endif endif endif @@ -121,8 +125,69 @@ lib-noranlib: subdir_lib ifeq (yes,$(build-shared)) # Build the shared object from the PIC object library. -lib: $(common-objpfx)libc.so -endif +lib: $(common-objpfx)libc.so $(common-objpfx)linkobj/libc.so +endif # $(build-shared) + +# Used to build testrun.sh. +define testrun-script +#!/bin/bash +builddir=`dirname "$$0"` +GCONV_PATH="$${builddir}/iconvdata" + +usage () { + echo "usage: $$0 [--tool=strace] PROGRAM [ARGUMENTS...]" 2>&1 + echo " $$0 --tool=valgrind PROGRAM [ARGUMENTS...]" 2>&1 + exit 1 +} + +toolname=default +while test $$# -gt 0 ; do + case "$$1" in + --tool=*) + toolname="$${1:7}" + shift + ;; + --*) + usage + ;; + *) + break + ;; + esac +done + +if test $$# -eq 0 ; then + usage +fi + +case "$$toolname" in + default) + exec $(subst $(common-objdir),"$${builddir}", $(test-program-prefix)) \ + $${1+"$$@"} + ;; + strace) + exec strace $(patsubst %, -E%, $(run-program-env)) \ + $(test-via-rtld-prefix) $${1+"$$@"} + ;; + valgrind) + exec env $(run-program-env) valgrind $(test-via-rtld-prefix) $${1+"$$@"} + ;; + *) + usage + ;; +esac +endef + +# This is a handy script for running any dynamically linked program against +# the current libc build for testing. +$(common-objpfx)testrun.sh: $(common-objpfx)config.make \ + $(..)Makeconfig $(..)Makefile + $(file >$@T,$(testrun-script)) + chmod a+x $@T + mv -f $@T $@ +postclean-generated += testrun.sh + +others: $(common-objpfx)testrun.sh # Makerules creates a file `stubs' in each subdirectory, which # contains `#define __stub_FUNCTION' for each function defined in that @@ -131,42 +196,52 @@ endif subdir-stubs := $(foreach dir,$(subdirs),$(common-objpfx)$(dir)/stubs) +ifndef abi-variants +installed-stubs = $(inst_includedir)/gnu/stubs.h +else +installed-stubs = $(inst_includedir)/gnu/stubs-$(default-abi).h + +$(inst_includedir)/gnu/stubs.h: $(+force) + $(make-target-directory) + { \ + echo '/* This file is automatically generated.';\ + echo " This file selects the right generated file of \`__stub_FUNCTION' macros";\ + echo ' based on the architecture being compiled for. */'; \ + echo ''; \ + $(foreach h,$(abi-includes), echo '#include <$(h)>';) \ + echo ''; \ + $(foreach v,$(abi-variants),\ + $(if $(abi-$(v)-condition),\ + echo '#if $(abi-$(v)-condition)'; \ + echo '# include '); \ + $(if $(abi-$(v)-condition),echo '#endif';) \ + rm -f $(@:.d=.h).new$(v); \ + ) \ + } > $(@:.d=.h).new + mv -f $(@:.d=.h).new $(@:.d=.h) + +install-others-nosubdir: $(installed-stubs) +endif + + # Since stubs.h is never needed when building the library, we simplify the # hairy installation process by producing it in place only as the last part # of the top-level `make install'. It depends on subdir_install, which # iterates over all the subdirs; subdir_install in each subdir depends on # the subdir's stubs file. Having more direct dependencies would result in # extra iterations over the list for subdirs and many recursive makes. -$(inst_includedir)/gnu/stubs.h: subdir_install +$(installed-stubs): include/stubs-prologue.h subdir_install $(make-target-directory) @rm -f $(objpfx)stubs.h - (echo '/* This file is automatically generated.';\ - echo ' It defines a symbol `__stub_FUNCTION'\'' for each function';\ - echo ' in the C library which is a stub, meaning it will fail';\ - echo ' every time called, usually setting errno to ENOSYS. */';\ - sort $(subdir-stubs)) > $(objpfx)stubs.h + (sed '/^@/d' $<; LC_ALL=C sort $(subdir-stubs)) > $(objpfx)stubs.h if test -r $@ && cmp -s $(objpfx)stubs.h $@; \ then echo 'stubs.h unchanged'; \ else $(INSTALL_DATA) $(objpfx)stubs.h $@; fi rm -f $(objpfx)stubs.h -ifeq (yes,$(build-shared)) - -$(inst_includedir)/gnu/lib-names.h: $(common-objpfx)gnu/lib-names.h $(+force) - $(make-target-directory) - if test -r $@ && cmp -s $< $@; \ - then echo 'gnu/lib-names.h unchanged'; \ - else $(INSTALL_DATA) $< $@; fi -endif - -# The `glibcbug' script contains the version number and it shall be rebuild -# whenever this changes or the `glibcbug.in' file. -$(objpfx)glibcbug: $(common-objpfx)config.status glibcbug.in - cd $( $@; \ + $(evaluate-test) +endif + +tests-special += $(objpfx)check-local-headers.out +$(objpfx)check-local-headers.out: scripts/check-local-headers.sh + AWK='$(AWK)' scripts/check-local-headers.sh \ + "$(includedir)" "$(objpfx)" < /dev/null > $@; \ + $(evaluate-test) + +ifneq "$(headers)" "" +# Special test of all the installed headers in this directory. +tests-special += $(objpfx)check-installed-headers-c.out +libof-check-installed-headers-c := testsuite +$(objpfx)check-installed-headers-c.out: \ + scripts/check-installed-headers.sh $(headers) + $(SHELL) $(..)scripts/check-installed-headers.sh c \ + "$(CC) $(filter-out -std=%,$(CFLAGS)) -D_ISOMAC $(+includes)" \ + $(headers) > $@; \ + $(evaluate-test) + +ifneq "$(CXX)" "" +tests-special += $(objpfx)check-installed-headers-cxx.out +libof-check-installed-headers-cxx := testsuite +$(objpfx)check-installed-headers-cxx.out: \ + scripts/check-installed-headers.sh $(headers) + $(SHELL) $(..)scripts/check-installed-headers.sh c++ \ + "$(CXX) $(filter-out -std=%,$(CXXFLAGS)) -D_ISOMAC $(+includes)" \ + $(headers) > $@; \ + $(evaluate-test) +endif # $(CXX) + +tests-special += $(objpfx)check-wrapper-headers.out +$(objpfx)check-wrapper-headers.out: scripts/check-wrapper-headers.py $(headers) + $(PYTHON) $< --root=. --subdir=. $(headers) \ + --generated $(common-generated) > $@; $(evaluate-test) +endif # $(headers) + +define summarize-tests +@egrep -v '^(PASS|XFAIL):' $(objpfx)$1 || true +@echo "Summary of test results$2:" +@sed 's/:.*//' < $(objpfx)$1 | sort | uniq -c +@! egrep -q -v '^(X?PASS|XFAIL|UNSUPPORTED):' $(objpfx)$1 +endef + +# The intention here is to do ONE install of our build into the +# testroot.pristine/ directory, then rsync (internal to +# support/test-container) that to testroot.root/ at the start of each +# test. That way we can promise each test a "clean" install, without +# having to do the install for each test. +# +# In addition, we have to copy some files (which we build) into this +# root in addition to what glibc installs. For example, many tests +# require additional programs including /bin/sh, /bin/true, and +# /bin/echo, all of which we build below to limit library dependencies +# to just those things in glibc and language support libraries which +# we also copy into the into the rootfs. To determine what language +# support libraries we need we build a "test" program in either C or +# (if available) C++ just so we can copy in any shared objects +# (which we do not build) that GCC-compiled programs depend on. + + +ifeq (,$(CXX)) +LINKS_DSO_PROGRAM = links-dso-program-c +else +LINKS_DSO_PROGRAM = links-dso-program +endif + +$(tests-container) $(addsuffix /tests,$(subdirs)) : \ + $(objpfx)testroot.pristine/install.stamp +$(objpfx)testroot.pristine/install.stamp : + test -d $(objpfx)testroot.pristine || \ + mkdir $(objpfx)testroot.pristine + # We need a working /bin/sh for some of the tests. + test -d $(objpfx)testroot.pristine/bin || \ + mkdir $(objpfx)testroot.pristine/bin + cp $(objpfx)support/shell-container $(objpfx)testroot.pristine/bin/sh + cp $(objpfx)support/echo-container $(objpfx)testroot.pristine/bin/echo + cp $(objpfx)support/true-container $(objpfx)testroot.pristine/bin/true +ifeq ($(run-built-tests),yes) + # Copy these DSOs first so we can overwrite them with our own. + for dso in `$(test-wrapper-env) LD_TRACE_LOADED_OBJECTS=1 \ + $(rtld-prefix) \ + $(objpfx)testroot.pristine/bin/sh \ + | grep / | sed 's/^[^/]*//' | sed 's/ .*//'` ;\ + do \ + test -d `dirname $(objpfx)testroot.pristine$$dso` || \ + mkdir -p `dirname $(objpfx)testroot.pristine$$dso` ;\ + $(test-wrapper) cp $$dso $(objpfx)testroot.pristine$$dso ;\ + done + for dso in `$(test-wrapper-env) LD_TRACE_LOADED_OBJECTS=1 \ + $(rtld-prefix) \ + $(objpfx)support/$(LINKS_DSO_PROGRAM) \ + | grep / | sed 's/^[^/]*//' | sed 's/ .*//'` ;\ + do \ + test -d `dirname $(objpfx)testroot.pristine$$dso` || \ + mkdir -p `dirname $(objpfx)testroot.pristine$$dso` ;\ + $(test-wrapper) cp $$dso $(objpfx)testroot.pristine$$dso ;\ + done +endif + $(MAKE) install DESTDIR=$(objpfx)testroot.pristine \ + subdirs='$(sorted-subdirs)' + touch $(objpfx)testroot.pristine/install.stamp + +tests-special-notdir = $(patsubst $(objpfx)%, %, $(tests-special)) +tests: $(tests-special) + $(..)scripts/merge-test-results.sh -s $(objpfx) "" \ + $(sort $(tests-special-notdir:.out=)) \ + > $(objpfx)subdir-tests.sum + $(..)scripts/merge-test-results.sh -t $(objpfx) subdir-tests.sum \ + $(sort $(subdirs) .) \ + > $(objpfx)tests.sum + $(call summarize-tests,tests.sum) +xtests: + $(..)scripts/merge-test-results.sh -t $(objpfx) subdir-xtests.sum \ + $(sort $(subdirs)) \ + > $(objpfx)xtests.sum + $(call summarize-tests,xtests.sum, for extra tests) + # The realclean target is just like distclean for the parent, but we want # the subdirs to know the difference in case they care. realclean distclean: parent-clean @@ -226,95 +436,66 @@ distclean-1: subdir_$(distclean-1) -rm -f $(config-generated) -rm -f $(addprefix $(objpfx),config.status config.cache config.log) -rm -f $(addprefix $(objpfx),config.make config-name.h config.h) - -rm -f $(addprefix $(objpfx),glibcbug) ifdef objdir -rm -f $(objpfx)Makefile endif -rm -f $(sysdep-$(distclean-1)) -.PHONY: echo_subdirs -echo_subdirs:;@echo '$(subdirs)' - -.PHONY: echo-distinfo parent_echo-distinfo -echo-distinfo: parent_echo-distinfo subdir_echo-distinfo -parent_echo-distinfo: - @echo $(addprefix +header+,$(headers)) \ - $(addprefix +nodist+,$(generated)) - +# Make the TAGS file for Emacs users. + +.PHONY: TAGS +TAGS: + scripts/list-sources.sh | sed -n -e '/Makefile/p' \ + $(foreach S,[chsSyl] cxx sh bash pl,\ + $(subst .,\.,-e '/.$S\(.in\)*$$/p')) \ + | $(ETAGS) -o $@ - # Make the distribution tarfile. +.PHONY: dist dist-prepare -distribute := README README.libm INSTALL FAQ FAQ.in NOTES NEWS BUGS \ - PROJECTS COPYING.LIB COPYING ChangeLog ChangeLog.[0-9] \ - Makefile Makeconfig Makerules Rules Make-dist MakeTAGS \ - extra-lib.mk o-iterator.mk configure configure.in \ - aclocal.m4 config.h.in config.make.in config-name.in \ - Makefile.in sysdep.h set-hooks.h libc-symbols.h \ - version.h shlib-versions rpm/Makefile rpm/template \ - rpm/rpmrc glibcbug.in abi-tags stub-tag.h \ - test-skeleton.c include/des.h Versions.def \ - include/sys/mman.h \ - $(addprefix scripts/, \ - rellns-sh config.sub config.guess \ - mkinstalldirs move-if-change install-sh \ - test-installation.pl gen-FAQ.pl versions.awk) - -distribute := $(strip $(distribute)) generated := $(generated) stubs.h -README: README.template version.h ; # Make-dist should update README. +files-for-dist := README INSTALL configure ChangeLog NEWS -define format-me -@rm -f $@ -makeinfo --no-validate --no-warn --no-headers $< -o $@ --chmod a-w $@ -endef -INSTALL: manual/install.texi; $(format-me) -NOTES: manual/creature.texi; $(format-me) -manual/dir-add.texi manual/dir-add.info: FORCE - $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) -FAQ: scripts/gen-FAQ.pl FAQ.in - $(PERL) $^ > $@.new && rm -f $@ && mv $@.new $@ && chmod a-w $@ -ifeq ($(with-cvs),yes) - test ! -d CVS || cvs $(CVSOPTS) commit -m'Regenerated: $(PERL) $^' $@ -endif -FORCE: +# Regenerate stuff, then error if these things are not committed yet. +dist-prepare: $(files-for-dist) + conf=`find sysdeps -name configure`; \ + $(MAKE) $$conf && \ + git diff --stat HEAD -- $^ $$conf \ + | $(AWK) '{ print; rc=1 } END { exit rc }' -rpm/%: subdir_distinfo - $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) - -iconvdata/%: - $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) +%.tar: FORCE + git archive --prefix=$*/ $* > $@.new + mv -f $@.new $@ -# This is a special goal for people making binary distributions. Normally -# everybody uses the DES based crypt library but for the distribution we -# need the only-MD5 based one as well. -md5-crypt/libmd5crypt: - $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) +# Do `make dist dist-version=X.Y.Z' to make tar files of an older version. -# glibc 2.0 contains some header files which aren't used with glibc 2.1 -# anymore. -# These rules should remove those headers -ifeq (,$(install_root)) -ifeq ($(old-glibc-headers),yes) -install: remove-old-headers -endif +ifneq (,$(strip $(dist-version))) +dist: $(foreach Z,.bz2 .gz .xz,$(dist-version).tar$Z) + md5sum $^ +else +dist: dist-prepare + @if v=`git describe`; then \ + echo Distribution version $$v; \ + $(MAKE) dist dist-version=$$v; \ + else \ + false; \ + fi endif -headers2_0 := __math.h bytesex.h confname.h direntry.h elfclass.h \ - errnos.h fcntlbits.h huge_val.h ioctl-types.h \ - ioctls.h iovec.h jmp_buf.h libc-lock.h local_lim.h \ - mathcalls.h mpool.h nan.h ndbm.h posix1_lim.h \ - posix2_lim.h posix_opt.h resourcebits.h schedbits.h \ - selectbits.h semaphorebits.h sigaction.h sigcontext.h \ - signum.h sigset.h sockaddrcom.h socketbits.h stab.def \ - statbuf.h statfsbuf.h stdio-lock.h stdio_lim.h \ - syscall-list.h termbits.h timebits.h ustatbits.h \ - utmpbits.h utsnamelen.h waitflags.h waitstatus.h \ - xopen_lim.h gnu/types.h sys/ipc_buf.h \ - sys/kernel_termios.h sys/msq_buf.h sys/sem_buf.h \ - sys/shm_buf.h sys/socketcall.h sigstack.h - -.PHONY: remove-old-headers -remove-old-headers: - rm -f $(addprefix $(inst_includedir)/, $(headers2_0)) +INSTALL: manual/install-plain.texi manual/macros.texi \ + $(common-objpfx)manual/pkgvers.texi manual/install.texi + makeinfo --no-validate --plaintext --no-number-sections \ + -I$(common-objpfx)manual $< -o $@-tmp + $(AWK) 'NF == 0 { ++n; next } \ + NF != 0 { while (n-- > 0) print ""; n = 0; print }' \ + < $@-tmp > $@-tmp2 + rm -f $@-tmp + -chmod a-w $@-tmp2 + mv -f $@-tmp2 $@ +$(common-objpfx)manual/%: FORCE + $(MAKE) $(PARALLELMFLAGS) -C manual $@ +FORCE: + +iconvdata/% localedata/% po/%: FORCE + $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F)