I've found I need a few diffs to build my i386 system cleanly with
gcc4 when the DESTDIR variable is set.


1) When DESTDIR is set, /usr/share/mk/bsd.sys.mk sets the gcc
-nostdinc flag and adds include directories pointing within the
DESTDIR. However, two additional directories are required to replace
the default standard directories used by g++.

Index: share/mk/bsd.sys.mk
===================================================================
RCS file: /cvs/src/share/mk/bsd.sys.mk,v
retrieving revision 1.9
diff -p -u -r1.9 bsd.sys.mk
--- share/mk/bsd.sys.mk 27 May 2006 23:01:21 -0000      1.9
+++ share/mk/bsd.sys.mk 16 Jul 2010 14:54:21 -0000
@@ -8,6 +8,8 @@
 .if defined(DESTDIR)
 CPPFLAGS+= -nostdinc -idirafter ${DESTDIR}/usr/include
 CXXFLAGS+= -idirafter ${DESTDIR}/usr/include/g++
+CXXFLAGS+= -idirafter ${DESTDIR}/usr/include/g++/${MACHINE_ARCH}-unknown-openbs
d${OSREV}
+CXXFLAGS+= -idirafter ${DESTDIR}/usr/include/g++/backward
 .endif


2) CXXFLAGS idirafter parameters are not being passed to mkdep. The
diff below works on my i386 system with or without DESTDIR set, but it
is a bit ugly so perhaps there's a better way.

Index: share/mk/bsd.dep.mk
===================================================================
RCS file: /cvs/src/share/mk/bsd.dep.mk,v
--- share/mk/bsd.dep.mk 27 Mar 2010 03:47:59 -0000      1.9
+++ share/mk/bsd.dep.mk 16 Jul 2010 14:54:21 -0000
@@ -20,10 +20,24 @@ subdirdepend: _SUBDIRUSE
          echo mkdep -a ${MKDEP} ${CFLAGS:M-[ID]*} ${CPPFLAGS} $$files; \
          mkdep -a ${MKDEP} ${CFLAGS:M-[ID]*} ${CPPFLAGS} $$files; \
        fi
-       @files="${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cxx}"; \
+       @function initcxxflags { \
+         cxxflags="$$*"; \
+       }; \
+       function getcxxflags { \
+         while [ $$# -gt 0 ]; do \
+           if [ "$$1" = "-idirafter" ]; then \
+             cxxflags="$${cxxflags} $$1 $$2"; \
+             shift; \
+           fi; \
+           shift; \
+         done; \
+       }; \
+       files="${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cxx}"; \
        if [ "$$files" != "  " ]; then \
-         echo mkdep -a ${MKDEP} ${CXXFLAGS:M-[ID]*} ${CPPFLAGS} $$files; \
-         mkdep -a ${MKDEP} ${CXXFLAGS:M-[ID]*} ${CPPFLAGS} $$files; \
+         initcxxflags ${CXXFLAGS:M-[ID]*}; \
+         getcxxflags ${CXXFLAGS}; \
+         echo mkdep -a ${MKDEP} $${cxxflags} ${CPPFLAGS} $$files; \
+         mkdep -a ${MKDEP} $${cxxflags} ${CPPFLAGS} $$files; \
        fi
 .  else
 .depend:


3) When DESTDIR is set, without the following patch the build aborts
during libstdc++-v3 with many errors of the form:

  error: template with C linkage

I believe implicit extern C has been disabled by default in later
versions of gcc. It seems to have been explicitly disabled for NetBSD
for some time.

Index: gnu/gcc/gcc/config/openbsd.h
===================================================================
RCS file: /cvs/src/gnu/gcc/gcc/config/openbsd.h,v
retrieving revision 1.4
diff -p -u -r1.4 openbsd.h
--- gnu/gcc/gcc/config/openbsd.h        29 Apr 2010 10:06:37 -0000      1.4
+++ gnu/gcc/gcc/config/openbsd.h        16 Jul 2010 14:53:35 -0000
@@ -314,6 +314,10 @@
    as this depends on a few other details as well...  */
 #define HANDLE_SYSV_PRAGMA 1

+/* Don't assume anything about the header files.  */
+#undef  NO_IMPLICIT_EXTERN_C
+#define NO_IMPLICIT_EXTERN_C    1
+
 /* Stack is explicitly denied execution rights on OpenBSD platforms.  */
 #define ENABLE_EXECUTE_STACK                                           \
 extern void __enable_execute_stack (void *);


4) An additional header required for gscpm(4):

Index: sys/arch/i386/pci/gscpm.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/pci/gscpm.c,v
retrieving revision 1.6
diff -p -u -r1.6 gscpm.c
--- sys/arch/i386/pci/gscpm.c   12 Dec 2006 23:14:27 -0000      1.6
+++ sys/arch/i386/pci/gscpm.c   16 Jul 2010 14:54:23 -0000
@@ -23,6 +23,7 @@
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/kernel.h>
+#include <sys/proc.h>
 #include <sys/sysctl.h>
 #ifdef __HAVE_TIMECOUNTER
 #include <sys/timetc.h>

Nathanael

Reply via email to