svn commit: r301939 - in head: . share/mk

Bryan Drewery bdrewery at FreeBSD.org
Wed Jun 15 23:58:05 UTC 2016


Author: bdrewery
Date: Wed Jun 15 23:58:03 2016
New Revision: 301939
URL: https://svnweb.freebsd.org/changeset/base/301939

Log:
  Fix native powerpc64 build of lib32 with in-tree GCC.
  
  - This was broken by r300350 and r300885.
  - Add some comments around the external GCC logic since it is spread out
    and in need of some cleanup.
  - The problem was that X_COMPILER_TYPE is always defined from CC->XCC's
    default, so if /usr/bin/cc is GCC (as it is on native powerpc64) then
    X_COMPILER_TYPE was getting GCC and triggering the external logic in
    Makefile.libcompat.  It was intended to always provide -isystem with
    GCC since --sysroot is used into the lib32 sysroot which won't modify
    the header path without the -isystem.  The use of the libc++/std=c++11
    override was only intended to be used for external compilers though
    (more accurately GCC 4.8+ but that's a separate assumption to
    cleanup).  Apply the same logic from Makefile.inc1 to Makefile.libcompat
    to only add the libc++ override when needed for external compilers.
  
  Pointyhat to:	bdrewery
  Tested with:	native ppc64 (swills), universe, ppc64 xtoolchain,
  		amd64 xtoolchain, sparc64 cross-build of ppc64 (host GCC 4.2)
  Reported by:	andreast, swills
  Approved by:	re (gjb)
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/Makefile.inc1
  head/Makefile.libcompat
  head/share/mk/src.opts.mk

Modified: head/Makefile.inc1
==============================================================================
--- head/Makefile.inc1	Wed Jun 15 23:58:00 2016	(r301938)
+++ head/Makefile.inc1	Wed Jun 15 23:58:03 2016	(r301939)
@@ -543,9 +543,12 @@ TARGET_ABI=	gnueabi
 .endif
 .endif
 .if defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc
-# GCC requires -isystem and -L when using a cross-compiler.
+# GCC requires -isystem and -L when using a cross-compiler.  --sysroot
+# won't set header path and -L is used to ensure the base library path
+# is added before the port PREFIX library path.
 XCFLAGS+=	-isystem ${WORLDTMP}/usr/include -L${WORLDTMP}/usr/lib
 # Force using libc++ for external GCC.
+# XXX: This should be checking MK_GNUCXX == no
 XCXXFLAGS+=	-isystem ${WORLDTMP}/usr/include/c++/v1 -std=c++11 \
 		-nostdinc++ -L${WORLDTMP}/../lib/libc++
 .else

Modified: head/Makefile.libcompat
==============================================================================
--- head/Makefile.libcompat	Wed Jun 15 23:58:00 2016	(r301938)
+++ head/Makefile.libcompat	Wed Jun 15 23:58:03 2016	(r301939)
@@ -72,13 +72,21 @@ LIBCOMPATCFLAGS+=	${LIBCOMPATCPUFLAGS} \
 # -B is needed to find /usr/lib32/crti.o for GCC and /usr/libsoft/crti.o for
 # Clang/GCC.
 LIBCOMPATCFLAGS+=	-B${LIBCOMPATTMP}/usr/lib${libcompat}
+
 .if defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc
-# GCC requires -isystem when using a cross-compiler.
+# GCC requires -isystem when using a cross-compiler and --sysroot.  Note that
+# Makefile.inc1 only applies this with an external compiler but libcompat
+# always does since even in-tree GCC 4.2 needs this to override the built-in
+# sysroot path which --sysroot does not actually do for headers.
 LIBCOMPATCFLAGS+=	-isystem ${LIBCOMPATTMP}/usr/include
 # Force using libc++ for external GCC.
+# XXX: This should be checking MK_GNUCXX == no
+.if ${MK_CROSS_COMPILER} == "no" || \
+    (${MK_CLANG_BOOTSTRAP} == "no" && ${MK_GCC_BOOTSTRAP} == "no")
 LIBCOMPATCXXFLAGS+=	-isystem ${LIBCOMPATTMP}/usr/include/c++/v1 -std=c++11 \
 			-nostdinc++ -L${LIBCOMPAT_OBJTREE}${.CURDIR}/lib/libc++
 .endif
+.endif
 
 # Yes, the flags are redundant.
 LIBCOMPATWMAKEENV+= MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTREE} \

Modified: head/share/mk/src.opts.mk
==============================================================================
--- head/share/mk/src.opts.mk	Wed Jun 15 23:58:00 2016	(r301938)
+++ head/share/mk/src.opts.mk	Wed Jun 15 23:58:03 2016	(r301939)
@@ -419,6 +419,9 @@ MK_LLDB:=	no
 # gcc 4.8 and newer supports libc++, so suppress gnuc++ in that case.
 # while in theory we could build it with that, we don't want to do
 # that since it creates too much confusion for too little gain.
+# XXX: This is incomplete and needs X_COMPILER_TYPE/VERSION checks too
+#      to prevent Makefile.inc1 from bootstrapping unneeded dependencies
+#      and to support 'make delete-old' when supplying an external toolchain.
 .if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 40800
 MK_GNUCXX:=no
 MK_GCC:=no


More information about the svn-src-all mailing list