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