mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-05 19:35:52 +03:00
The current approach tracks math maximum supported errors by explicitly setting them per function and architecture. On newer implementations or new compiler versions, the file is updated with newer values if it shows higher results. The idea is to track the maximum known error, to update the manual with the obtained values. The constant libm-test-ulps shows little value, where it is usually a mechanical change done by the maintainer, for past releases it is usually ignored whether the ulp change resulted from a compiler regression, and the math tests already have a maximum ulp error that triggers a regression. It was shown by a recent update after the new acosf [1] implementation that is correctly rounded, where the libm-test-ulps was indeed from a compiler issue. This patch removes all arch-specific libm-test-ulps, adds system generic libm-test-ulps where applicable, and changes its semantics. The generic files now track specific implementation constraints, like if it is expected to be correctly rounded, or if the system-specific has different error expectations. Now multiple libm-test-ulps can be defined, and system-specific overrides generic implementation. This is for the case where arch-specific implementation might show worse precision than generic implementation, for instance, the cbrtf on i686. Regressions are only reported if the implementation shows larger errors than 9 ulps (13 for IBM long double) unless it is overridden by libm-test-ulps and the maximum error is not printed at the end of tests. The regen-ulps rule is also removed since it does not make sense to update the libm-test-ulps automatically. The manual error table is also removed, Paul Zimmermann and others have been tracking libm precision with a more comprehensive analysis for some releases; so link to his work instead. [1] https://sourceware.org/git/?p=glibc.git;a=commit;h=9cc9f8e11e8fb8f54f1e84d9f024917634a78201
209 lines
6.9 KiB
Makefile
209 lines
6.9 KiB
Makefile
# Copyright (C) 1992-2025 Free Software Foundation, Inc.
|
|
# This file is part of the GNU C Library.
|
|
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
|
|
# The GNU C Library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with the GNU C Library; if not, see
|
|
# <https://www.gnu.org/licenses/>.
|
|
|
|
# Makefile for the GNU C Library manual.
|
|
|
|
subdir := manual
|
|
|
|
include ../Makeconfig
|
|
|
|
.PHONY: dvi pdf info html
|
|
|
|
dvi: $(objpfx)libc.dvi
|
|
pdf: $(objpfx)libc.pdf
|
|
|
|
TEXI2DVI = texi2dvi
|
|
TEXI2PDF = texi2dvi --pdf
|
|
|
|
ifneq ($(strip $(MAKEINFO)),:)
|
|
info: $(objpfx)libc.info
|
|
endif
|
|
|
|
chapters = $(addsuffix .texi, \
|
|
intro errno memory ctype string charset locale \
|
|
message search pattern io stdio llio filesys \
|
|
pipe socket terminal syslog math arith stdbit time \
|
|
resource setjmp signal startup process ipc job \
|
|
nss users sysinfo conf crypt debug threads \
|
|
dynlink probes tunables)
|
|
appendices = lang.texi header.texi install.texi maint.texi platform.texi \
|
|
contrib.texi
|
|
licenses = freemanuals.texi lgpl-2.1.texi fdl-1.3.texi
|
|
|
|
-include $(objpfx)texis
|
|
$(objpfx)texis: texis.awk $(chapters) $(appendices) $(licenses)
|
|
$(make-target-directory)
|
|
$(AWK) -f $^ > $@.T
|
|
mv -f $@.T $@
|
|
|
|
nonexamples = $(filter-out %.c.texi, $(texis))
|
|
examples = $(filter %.c.texi, $(texis))
|
|
|
|
# Generated files directly included from libc.texinfo.
|
|
libc-texi-generated = chapters.texi top-menu.texi dir-add.texi \
|
|
version.texi pkgvers.texi
|
|
|
|
# Add path to build dir for generated files
|
|
texis-path := $(filter-out $(libc-texi-generated) summary.texi $(examples), \
|
|
$(texis)) \
|
|
$(addprefix $(objpfx),$(filter $(libc-texi-generated) summary.texi \
|
|
$(examples), $(texis)))
|
|
|
|
# Kludge: implicit rule so Make knows the one command does it all.
|
|
chapters.% top-menu.%: libc-texinfo.sh $(texis-path) Makefile
|
|
AWK=$(AWK) $(SHELL) $< $(objpfx) \
|
|
'$(chapters)' \
|
|
'$(appendices) $(licenses)'
|
|
|
|
# Verify validity of texinfo sources against project rules.
|
|
tests-special += \
|
|
$(objpfx)check-deftype.out \
|
|
$(objpfx)check-safety.out \
|
|
# tests-special
|
|
|
|
$(objpfx)libc.dvi $(objpfx)libc.pdf $(objpfx)libc.info: \
|
|
$(addprefix $(objpfx),$(libc-texi-generated))
|
|
$(objpfx)libc.dvi $(objpfx)libc.pdf: texinfo.tex
|
|
|
|
html: $(objpfx)libc/index.html
|
|
$(objpfx)libc/index.html: $(addprefix $(objpfx),$(libc-texi-generated))
|
|
$(MAKEINFO) -P $(objpfx) -o $(objpfx)libc --html libc.texinfo
|
|
|
|
# Generate the summary from the Texinfo source files for each chapter.
|
|
$(objpfx)summary.texi: $(objpfx)stamp-summary ;
|
|
$(objpfx)stamp-summary: summary.pl $(filter-out $(objpfx)summary.texi, \
|
|
$(texis-path))
|
|
$(SHELL) ./check-safety.sh $(filter-out $(objpfx)%, $(texis-path))
|
|
$(SHELL) ./check-deftype.sh $(filter-out $(objpfx)%, $(texis-path))
|
|
LC_ALL=C $(PERL) $^ > $(objpfx)summary-tmp
|
|
$(move-if-change) $(objpfx)summary-tmp $(objpfx)summary.texi
|
|
touch $@
|
|
|
|
$(objpfx)check-safety.out: check-safety.sh
|
|
$(SHELL) $< > $@ ; \
|
|
$(evaluate-test)
|
|
|
|
$(objpfx)check-deftype.out: check-deftype.sh
|
|
$(SHELL) $< > $@ ; \
|
|
$(evaluate-test)
|
|
|
|
# Generate a file which can be added to the `dir' content to provide direct
|
|
# access to the documentation of the function, variables, and other
|
|
# definitions.
|
|
$(objpfx)dir-add.texi: xtract-typefun.awk $(texis-path)
|
|
(echo "@dircategory GNU C library functions and macros"; \
|
|
echo "@direntry"; \
|
|
$(AWK) -f $^ | sort; \
|
|
echo "@end direntry") > $@.new
|
|
mv -f $@.new $@
|
|
|
|
# Package version and bug reporting URL.
|
|
$(objpfx)pkgvers.texi: $(objpfx)stamp-pkgvers ;
|
|
$(objpfx)stamp-pkgvers: $(common-objpfx)config.make
|
|
echo "@ifclear PKGVERS" > $(objpfx)pkgvers-tmp
|
|
echo "@set PKGVERS" >> $(objpfx)pkgvers-tmp
|
|
echo "@set PKGVERSION $(PKGVERSION_TEXI)" >> $(objpfx)pkgvers-tmp
|
|
if [ "$(PKGVERSION_TEXI)" = "(GNU libc) " ]; then \
|
|
echo "@set PKGVERSION_DEFAULT" >> $(objpfx)pkgvers-tmp; \
|
|
fi
|
|
echo "@set REPORT_BUGS_TO $(REPORT_BUGS_TEXI)" >> $(objpfx)pkgvers-tmp
|
|
echo "@set man_pages_version $(man-pages-version)" >> $(objpfx)pkgvers-tmp; \
|
|
echo "@end ifclear" >> $(objpfx)pkgvers-tmp
|
|
$(move-if-change) $(objpfx)pkgvers-tmp $(objpfx)pkgvers.texi
|
|
touch $@
|
|
|
|
# Generate a file with the version number.
|
|
$(objpfx)version.texi: $(objpfx)stamp-version ;
|
|
$(objpfx)stamp-version: $(common-objpfx)config.make
|
|
echo "@set VERSION $(version)" > $(objpfx)version-tmp
|
|
$(move-if-change) $(objpfx)version-tmp $(objpfx)version.texi
|
|
touch $@
|
|
|
|
# Generate Texinfo files from the C source for the example programs.
|
|
$(objpfx)%.c.texi: examples/%.c
|
|
sed -e '1,/^\*\/$$/d' \
|
|
-e 's,[{}],@&,g' \
|
|
-e 's,/\*\(@.*\)\*/,\1,g' \
|
|
-e 's,/\* *,/* @r{,g' -e 's, *\*/,} */,' \
|
|
-e 's/\(@[a-z][a-z]*\)@{\([^}]*\)@}/\1{\2}/g'\
|
|
$< | expand > $@.new
|
|
mv -f $@.new $@
|
|
|
|
$(objpfx)%.info: %.texinfo
|
|
LANGUAGE=C LC_ALL=C $(MAKEINFO) -P $(objpfx) --output=$@ $<
|
|
|
|
$(objpfx)%.dvi: %.texinfo
|
|
cd $(objpfx);$(TEXI2DVI) -I $(shell cd $(<D) && pwd) --output=$@ \
|
|
$(shell cd $(<D) && pwd)/$<
|
|
|
|
$(objpfx)%.pdf: %.texinfo
|
|
cd $(objpfx);$(TEXI2PDF) -I $(shell cd $(<D) && pwd) --output=$@ \
|
|
$(shell cd $(<D) && pwd)/$<
|
|
|
|
|
|
# Distribution.
|
|
minimal-dist = \
|
|
$(filter-out summary.texi, $(nonexamples)) \
|
|
$(patsubst %.c.texi,examples/%.c, $(examples)) \
|
|
check-deftype.sh \
|
|
check-safety.sh \
|
|
libc-texinfo.sh \
|
|
libc.texinfo \
|
|
libm-err.texi \
|
|
stamp-libm-err \
|
|
summary.pl \
|
|
texis.awk \
|
|
tsort.awk \
|
|
# minimal-dist
|
|
|
|
indices = cp fn pg tp vr ky
|
|
generated-dirs += libc
|
|
generated += libc.dvi libc.pdf libc.tmp libc.info* \
|
|
stubs \
|
|
texis summary.texi stamp-summary *.c.texi \
|
|
$(foreach index,$(indices),libc.$(index) libc.$(index)s) \
|
|
libc.log libc.aux libc.toc \
|
|
$(libc-texi-generated) \
|
|
stamp-libm-err stamp-version
|
|
|
|
include ../Rules
|
|
|
|
.PHONY: install subdir_install install-data
|
|
install-data subdir_install: install
|
|
# Generated files requiring python: libm-err.texi
|
|
# Generated files requiring perl: summary.texi
|
|
ifneq ($(PERL),no)
|
|
ifneq ($(strip $(MAKEINFO)),:)
|
|
install: $(inst_infodir)/libc.info
|
|
@if $(SHELL) -c '$(INSTALL_INFO) --version' >/dev/null 2>&1; then \
|
|
test -f $(inst_infodir)/dir || $(INSTALL_DATA) dir $(inst_infodir);\
|
|
$(INSTALL_INFO) --info-dir=$(inst_infodir) $(inst_infodir)/libc.info;\
|
|
else : ; fi
|
|
endif
|
|
endif
|
|
# Catchall implicit rule for other installation targets from the parent.
|
|
install-%: ;
|
|
|
|
$(inst_infodir)/libc.info: $(objpfx)libc.info
|
|
$(make-target-directory)
|
|
for file in $<*; do \
|
|
$(INSTALL_DATA) $$file $(@D)/; \
|
|
done
|
|
|
|
TAGS: $(minimal-dist)
|
|
$(ETAGS) -o $@ $^
|