From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9396 invoked by alias); 14 Mar 2002 22:25:34 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 9361 invoked from network); 14 Mar 2002 22:25:29 -0000 Received: from unknown (HELO perdition.linnaean.org) (65.96.132.240) by sources.redhat.com with SMTP; 14 Mar 2002 22:25:29 -0000 Received: by perdition.linnaean.org (Postfix, from userid 5281) id AC6421B9C4; Thu, 14 Mar 2002 17:25:28 -0500 (EST) From: Roland McGrath MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: GNU libc hackers Subject: preprocess-versions Emacs: because you deserve a brk today. Message-Id: <20020314222528.AC6421B9C4@perdition.linnaean.org> Date: Thu, 14 Mar 2002 14:25:00 -0000 X-SW-Source: 2002-03/txt/msg00055.txt.bz2 The changes below get rid of the pipelines using $(preprocess-versions) in favor of producing intermediate files. The reason this is better is that the pipelines mask the exit status from cpp, so if there were errors your build would continue happilly but would have used bogus or partial cpp output to produce the final files. With this fixed, you immediately get a build error on a fresh build because abi-versions.h doesn't exist yet when Versions.all is being built. This causes a real build botch for the Hurd --enable-libio case. That bug is fixed by this further patch (applied after the larger patch below): 2002-03-14 Roland McGrath * Makerules ($(common-objpfx)Versions.v.i): Depend on abi-versions.h. --- Makerules.orig Thu Mar 14 14:22:42 2002 +++ Makerules Thu Mar 14 14:22:48 2002 @@ -286,6 +286,7 @@ # See %.v/%.v.i implicit rules in Makeconfig. $(common-objpfx)Versions.v.i: $(wildcard $(all-subdirs:%=$(..)%/Versions)) \ $(wildcard $(sysdirs:%=%/Versions)) \ + $(common-objpfx)abi-versions.h \ $(sysd-versions-force) $(common-objpfx)sysd-versions: $(common-objpfx)Versions.all \ $(common-objpfx)Versions.v \ Unless there are objections, I would like to commit all these changes to both branches. Ok? Thanks, Roland 2002-03-14 Roland McGrath * Makeconfig (%.v.i, %.v): New implicit rules. (preprocess-versions): Variable removed. ($(common-objpfx)shlib-versions.v.i): New target giving just the shlib-versions input files as dependencies. ($(common-objpfx)soversions.i): Depend on that instead of the input files. Use it as input instead of using a pipeline. (postclean-generated): Append soversions.i, shlib-versions.v, and shlib-versions.v.i here. * Makerules ($(common-objpfx)Versions.def.v.i): New target giving just the Versions.def input files as dependencies. ($(common-objpfx)Versions.v.i): Likewise for Versions files. ($(common-objpfx)Versions.all): Depend on that instead of the input files. Use it as input instead of using a pipeline. ($(common-objpfx)sysd-versions): Likewise with Versions.v.i. (postclean-generated): Append those .v and .v.i files here. Index: Makeconfig =================================================================== RCS file: /cvs/glibc/libc/Makeconfig,v retrieving revision 1.265 diff -u -r1.265 Makeconfig --- Makeconfig 2001/09/12 18:49:45 1.265 +++ Makeconfig 2002/03/14 22:17:01 @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2000, 2001 Free Software Foundation, Inc. +# Copyright (C) 1991-2000,01,02 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 @@ -731,15 +731,24 @@ ifeq (yes, $(build-shared)) -# Commands to put in a pipeline to preprocess a file with # comments -# %ifdef et al based on config.h settings or other %include'd files. -define preprocess-versions -sed '/^[ ]*#/d;s/^[ ]*%/#/' \ -| $(CC) -E -undef -I$(common-objdir) -I$(..)include \ - -include $(common-objpfx)config.h \ - -DASSEMBLER -x assembler-with-cpp - \ -| sed '/^[ ]*#/d;/^[ ]*$$/d' -endef +# This is a pair of implicit rules to preprocess a file with # comments, +# %ifdef et al, based on config.h settings or other %include'd files. +# We use chained rules instead of a pipeline here so that we can properly +# check the exit status of cpp rather than using its bad output when there +# is a preprocessing error. Another rule should depend on the output file +# `FOO.v', and along with that `FOO.v.i' should be given dependencies +# listing both its input files, and any header files that it may reference +# (but no commands). +%.v.i: $(common-objpfx)config.h + sed '/^[ ]*#/d;s/^[ ]*%/#/' $(filter-out FORCE %.h,$^) \ + | $(CC) -E -undef -I$(common-objdir) -I$(..)include \ + -include $(common-objpfx)config.h \ + -DASSEMBLER -x assembler-with-cpp - \ + > $@T + mv -f $@T $@ +%.v: %.v.i + sed '/^[ ]*#/d;/^[ ]*$$/d' $< > $@T + mv -f $@T $@ # Process the shlib-versions file, which tells us what shared library # version numbers to use when we install shared objects on this system. @@ -747,28 +756,26 @@ ifeq ($(sysd-sorted-done),t) -include $(common-objpfx)soversions.mk ifndef avoid-generated -$(common-objpfx)soversions.i: $(..)shlib-versions $(..)Makeconfig \ - $(wildcard $(patsubst %, $(..)%/shlib-versions,\ - $(add-ons) \ - $(subdirs))) \ - $(common-objpfx)config.make - cat $(filter-out $(..)Makeconfig $(common-objpfx)config.make,$^) \ - | $(preprocess-versions) \ - | while read conf version setname; do \ - test -n "$$version" && \ - test `expr '$(config-machine)-$(config-vendor)-$(config-os)' \ - : "$$conf"` != 0 || continue; \ - if test "x$$version" = xDEFAULT; then \ - default_setname="$$setname"; \ - else \ - lib=`echo $$version | sed 's/=.*$$//'`; \ - if eval test -z "\$${versioned_$${lib}}"; then \ - eval versioned_$${lib}=yes; \ - number=`echo $$version | sed "s/^.*=//"`; \ - echo $$lib $$number $${setname:-$${default_setname}}; \ - fi; \ +$(common-objpfx)shlib-versions.v.i: \ + $(..)shlib-versions $(wildcard $(patsubst %, $(..)%/shlib-versions,\ + $(add-ons) \ + $(subdirs))) +$(common-objpfx)soversions.i: $(common-objpfx)shlib-versions.v + while read conf version setname; do \ + test -n "$$version" && \ + test `expr '$(config-machine)-$(config-vendor)-$(config-os)' \ + : "$$conf"` != 0 || continue; \ + if test "x$$version" = xDEFAULT; then \ + default_setname="$$setname"; \ + else \ + lib=`echo $$version | sed 's/=.*$$//'`; \ + if eval test -z "\$${versioned_$${lib}}"; then \ + eval versioned_$${lib}=yes; \ + number=`echo $$version | sed "s/^.*=//"`; \ + echo $$lib $$number $${setname:-$${default_setname}}; \ fi; \ - done > $@T; exit 0 + fi; \ + done < $< > $@T; exit 0 mv -f $@T $@ $(common-objpfx)soversions.mk: $(common-objpfx)soversions.i (while read lib number setname; do \ @@ -784,7 +791,8 @@ endif endif -postclean-generated += soversions.mk +postclean-generated += soversions.mk soversions.i \ + shlib-versions.v shlib-versions.v.i # Generate the header containing the names of all shared libraries. # We use a stamp file to avoid uncessary recompilations. Index: Makerules =================================================================== RCS file: /cvs/glibc/libc/Makerules,v retrieving revision 1.358 diff -u -r1.358 Makerules --- Makerules 2001/11/16 01:02:19 1.358 +++ Makerules 2002/03/14 22:17:01 @@ -1,4 +1,4 @@ -# Copyright (C) 1991-1999, 2000,2001 Free Software Foundation, Inc. +# Copyright (C) 1991-1999,2000,01,02 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 @@ -263,35 +263,38 @@ -include $(common-objpfx)sysd-versions $(addprefix $(common-objpfx),$(version-maps)): $(common-objpfx)sysd-versions common-generated += $(version-maps) -postclean-generated += sysd-versions Versions.all abi-versions.h +postclean-generated += sysd-versions Versions.all abi-versions.h \ + Versions.def.v.i Versions.def.v Versions.v.i Versions.v ifndef avoid-generated ifneq ($(sysd-versions-subdirs),$(all-subdirs) $(config-sysdirs)) sysd-versions-force = FORCE FORCE: endif +# See %.v/%.v.i implicit rules in Makeconfig. +$(common-objpfx)Versions.def.v.i: $(..)Versions.def \ + $(wildcard $(add-ons:%=$(..)%/Versions.def)) $(common-objpfx)Versions.all: $(..)scripts/firstversions.awk \ $(common-objpfx)soversions.i \ - $(..)Versions.def \ - $(wildcard $(add-ons:%=$(..)%/Versions.def)) + $(common-objpfx)Versions.def.v { while read lib version setname; do \ test -z "$$setname" || echo "$$lib : $$setname"; \ done < $(word 2,$^); \ - cat $(filter-out $< $(word 2,$^),$^) \ - | $(preprocess-versions); \ + cat $(word 3,$^); \ } | LC_ALL=C $(AWK) -f $< > $@T mv -f $@T $@ +# See %.v/%.v.i implicit rules in Makeconfig. +$(common-objpfx)Versions.v.i: $(wildcard $(all-subdirs:%=$(..)%/Versions)) \ + $(wildcard $(sysdirs:%=%/Versions)) \ + $(sysd-versions-force) $(common-objpfx)sysd-versions: $(common-objpfx)Versions.all \ - $(..)scripts/versions.awk \ - $(wildcard $(all-subdirs:%=$(..)%/Versions)) \ - $(wildcard $(sysdirs:%=%/Versions)) \ - $(sysd-versions-force) + $(common-objpfx)Versions.v \ + $(..)scripts/versions.awk ( echo 'sysd-versions-subdirs = $(all-subdirs) $(config-sysdirs)' ; \ - cat $(filter-out $< $(word 2,$^) $(sysd-versions-force),$^) \ - | $(preprocess-versions) \ + cat $(word 2,$^) \ | LC_ALL=C $(AWK) -v buildroot=$(common-objpfx) -v defsfile=$< \ -v move_if_change='$(move-if-change)' \ - -f $(word 2,$^); \ + -f $(word 3,$^); \ ) > $@T mv -f $@T $@ endif # avoid-generated