[BZ,#20314] Make copies of cstdlib/cmath and use them

Message ID CAMe9rOqzJ+Wb_iCWrZZCEpMpS-LiXaNxyGLVzNEJETmzQjZBeA@mail.gmail.com
State New, archived
Headers

Commit Message

H.J. Lu July 5, 2016, 2:29 p.m. UTC
  On Mon, Jul 4, 2016 at 6:11 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> On 30 Jun 2016 09:57, H.J. Lu wrote:
>> +             | grep cstdlib: | sed -e "s/:$$//")
>
> | sed -n "/cstdlib:/{s/:$$//;p}")
> -mike

Here is the updated patch.  OK for master?
  

Comments

Carlos O'Donell July 5, 2016, 5:22 p.m. UTC | #1
On 07/05/2016 10:29 AM, H.J. Lu wrote:
> On Mon, Jul 4, 2016 at 6:11 PM, Mike Frysinger <vapier@gentoo.org> wrote:
>> On 30 Jun 2016 09:57, H.J. Lu wrote:
>>> +             | grep cstdlib: | sed -e "s/:$$//")
>>
>> | sed -n "/cstdlib:/{s/:$$//;p}")
>> -mike
> 
> Here is the updated patch.  OK for master?
> 

Yes. I tested this on Fedora Rawhide and it fixes the issue.

We will need to find a better way to fix this, but for now it's the only
solution I can think of to easily fix 2.24.
  
Florian Weimer July 5, 2016, 8:51 p.m. UTC | #2
On 07/05/2016 07:22 PM, Carlos O'Donell wrote:
> On 07/05/2016 10:29 AM, H.J. Lu wrote:
>> On Mon, Jul 4, 2016 at 6:11 PM, Mike Frysinger <vapier@gentoo.org> wrote:
>>> On 30 Jun 2016 09:57, H.J. Lu wrote:
>>>> +             | grep cstdlib: | sed -e "s/:$$//")
>>>
>>> | sed -n "/cstdlib:/{s/:$$//;p}")
>>> -mike
>>
>> Here is the updated patch.  OK for master?
>>
>
> Yes. I tested this on Fedora Rawhide and it fixes the issue.
>
> We will need to find a better way to fix this, but for now it's the only
> solution I can think of to easily fix 2.24.

Yes, let's use this approach for the time being.

Thanks,
Florian
  

Patch

From 5763e9ea9e24fcae56c0aeef6bb745938c492511 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 30 Jun 2016 06:56:19 -0700
Subject: [PATCH] Make copies of cstdlib/cmath and use them

If C++ headers <cstdlib> or <cmath> are used, GCC 6 will include
/usr/include/stdlib.h or /usr/include/math.h from "#include_next"
(instead of stdlib/stdlib.h or math/math.h in the glibc source
directory), and this turns up as a make dependency.  An implicit
rule will kick in and make will try to install stdlib/stdlib.h or
math/math.h as /usr/include/stdlib.h or /usr/include/math.h because
the target is out of date.  We make a copy of <cstdlib> and <cmath>
in the glibc build directory so that stdlib/stdlib.h and math/math.h
will be used instead of /usr/include/stdlib.h and /usr/include/math.h.

	[BZ #20314]
	* Makeconfig (CXXFLAGS): Prepend -I$(common-objpfx).
	* Makerules (before-compile): Add $(common-objpfx)cstdlib and
	$(common-objpfx)cmath.
	($(common-objpfx)cstdlib): New target.
	($(common-objpfx)cmath): Likewise.
---
 Makeconfig |  3 ++-
 Makerules  | 24 ++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/Makeconfig b/Makeconfig
index 901e253..03fd89c 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -889,7 +889,8 @@  override CFLAGS	= -std=gnu11 -fgnu89-inline $(config-extra-cflags) \
 		  $(CFLAGS-$(@F)) $(tls-model) \
 		  $(foreach lib,$(libof-$(basename $(@F))) \
 				$(libof-$(<F)) $(libof-$(@F)),$(CFLAGS-$(lib)))
-override CXXFLAGS = $(c++-sysincludes) \
+# Use our copies of cstdlib and cmath.
+override CXXFLAGS = -I$(common-objpfx) $(c++-sysincludes) \
 		    $(filter-out %frame-pointer,$(+cflags)) $(sysdep-CFLAGS) \
 		    $(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) $(CFLAGS-$(@F))
 
diff --git a/Makerules b/Makerules
index f1ecd40..7e4077e 100644
--- a/Makerules
+++ b/Makerules
@@ -109,6 +109,30 @@  endif # avoid-generated
 endif # $(build-shared) = yes
 
 ifndef avoid-generated
+ifneq (,$(CXX))
+# If C++ headers <cstdlib> or <cmath> are used, GCC 6 will include
+# /usr/include/stdlib.h or /usr/include/math.h from "#include_next"
+# (instead of stdlib/stdlib.h or math/math.h in the glibc source
+# directory), and this turns up as a make dependency.  An implicit
+# rule will kick in and make will try to install stdlib/stdlib.h or
+# math/math.h as /usr/include/stdlib.h or /usr/include/math.h because
+# the target is out of date.  We make a copy of <cstdlib> and <cmath>
+# in the glibc build directory so that stdlib/stdlib.h and math/math.h
+# will be used instead of /usr/include/stdlib.h and /usr/include/math.h.
+before-compile := $(common-objpfx)cstdlib $(common-objpfx)cmath \
+	          $(before-compile)
+cstdlib=$(shell echo "\#include <cstdlib>" | $(CXX) -M -MP -x c++ - \
+		| sed -n "/cstdlib:/{s/:$$//;p}")
+$(common-objpfx)cstdlib: $(cstdlib)
+	$(INSTALL_DATA) $< $@T
+	$(move-if-change) $@T $@
+cmath=$(shell echo "\#include <cmath>" | $(CXX) -M -MP -x c++ - \
+		| sed -n "/cmath:/{s/:$$//;p}")
+$(common-objpfx)cmath: $(cmath)
+	$(INSTALL_DATA) $< $@T
+	$(move-if-change) $@T $@
+endif
+
 before-compile := $(common-objpfx)libc-abis.h $(before-compile)
 $(common-objpfx)libc-abis.h: $(common-objpfx)libc-abis.stamp; @:
 $(common-objpfx)libc-abis.stamp: $(..)scripts/gen-libc-abis \
-- 
2.7.4