tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Selecting a C++ compiler (was: build-issues with Q3 on netbsd-6-0 (GCC_REQD, c++11..))



So what about something along the lines of the attached patch?

The idea is to have the user select a GCC version to compile all C++ dialects 
with (GCC_CXX_VERSION, default 48) and

-- complain if the selected version doesn't support the used dialects
-- complain if the version mandated by GCC_REQD is higher
-- otherwise use that version instead of _GCC_REQD.

The default should probably be chosen more intelligently and the list of 
unsupported dialects is probably incomplete.
Index: compiler.mk
===================================================================
RCS file: /cvsroot/pkgsrc/mk/compiler.mk,v
retrieving revision 1.87
diff -u -r1.87 compiler.mk
--- compiler.mk	4 Jul 2017 14:35:55 -0000	1.87
+++ compiler.mk	10 Oct 2017 18:41:20 -0000
@@ -49,8 +49,7 @@
 #	c++14, gnu++14, fortran, fortran77, java, objc, obj-c++, and
 #	ada.  The default is "c".
 #
-#       The above is partly aspirational.  As an example c++11 does
-#       not force a new enough version of gcc.
+#       The above is partly aspirational.
 
 # The following variables are defined, and available for testing in
 # package Makefiles:
Index: compiler/gcc.mk
===================================================================
RCS file: /cvsroot/pkgsrc/mk/compiler/gcc.mk,v
retrieving revision 1.184
diff -u -r1.184 gcc.mk
--- compiler/gcc.mk	11 Sep 2017 09:06:41 -0000	1.184
+++ compiler/gcc.mk	10 Oct 2017 18:41:20 -0000
@@ -23,6 +23,11 @@
 # GCC_VERSION_SUFFIX
 #	Optional suffix for GCC binaries, i.e. if the installed names are like
 #	/usr/bin/g++-5, /usr/bin/gcc-5 etc.
+#
+# GCC_CXX_VERSION
+#	GCC version to use for packages using C++ dialects. Must be chosen
+#	once in mk.conf and all affected packages rebuilt if changed.
+#	Supported values are 48 49 5 6 7.
 
 # Package-settable variables:
 #
@@ -59,7 +64,7 @@
 COMPILER_GCC_MK=	defined
 
 _VARGROUPS+=	gcc
-_USER_VARS.gcc=	USE_NATIVE_GCC USE_PKGSRC_GCC
+_USER_VARS.gcc=	USE_NATIVE_GCC USE_PKGSRC_GCC GCC_CXX_VERSION
 _PKG_VARS.gcc=	GCC_REQD
 _SYS_VARS.gcc=	CC_VERSION CC_VERSION_STRING LANGUAGES.gcc
 _DEF_VARS.gcc=	\
@@ -76,6 +81,7 @@
 	_GCC_FC _GCC_LDFLAGS _GCC_LIBDIRS _GCC_PKG \
 	_GCC_PKGBASE _GCC_PKGSRCDIR _GCC_PKG_SATISFIES_DEP \
 	_GCC_PREFIX _GCC_REQD _GCC_STRICTEST_REQD _GCC_SUBPREFIX \
+	_GCC_CXX_STD_UNSUPP _GCC_CXX_TOOHIGH_PATTERNS \
 	_GCC_TEST_DEPENDS _GCC_NEEDS_A_FORTRAN _GCC_VARS _GCC_VERSION \
 	_GCC_VERSION_STRING \
 	_GCC_ADA _GCC_GMK _GCC_GLK _GCC_GDB _GCC_CHP _GCC_GLS _GCC_GNT _GCC_PRP \
@@ -225,7 +231,50 @@
 .    endif
 .  endfor
 .endfor
+
+.if !empty(USE_LANGUAGES:Mc++)
+# Handle GCCs requirement that the same version must be used for all packages
+# using C++
+GCC_CXX_VERSION?=	48
+
+.if ${GCC_CXX_VERSION} == "48"
+_GCC_REQD=		4.8
+_GCC_CXX_STD_UNSUPP=	c++14 g++14
+_GCC_CXX_TOOHIGH_PATTERNS=	${_GCC49_PATTERNS} ${_GCC5_PATTERNS} ${_GCC6_PATTERNS} ${_GCC7_PATTERNS} ${_GCC_AUX_PATTERNS}
+.elif ${GCC_CXX_VERSION} == "49"
+_GCC_REQD=		4.9
+_GCC_CXX_STD_UNSUPP=	# empty
+_GCC_CXX_TOOHIGH_PATTERNS=	${_GCC5_PATTERNS} ${_GCC6_PATTERNS} ${_GCC7_PATTERNS} ${_GCC_AUX_PATTERNS}
+.elif ${GCC_CXX_VERSION} == "5"
+_GCC_REQD=		5.0
+_GCC_CXX_STD_UNSUPP=	# empty
+_GCC_CXX_TOOHIGH_PATTERNS=	${_GCC6_PATTERNS} ${_GCC7_PATTERNS} ${_GCC_AUX_PATTERNS}
+.elif ${GCC_CXX_VERSION} == "6"
+_GCC_REQD=		6.0
+_GCC_CXX_STD_UNSUPP=	# empty
+_GCC_CXX_TOOHIGH_PATTERNS=	${_GCC7_PATTERNS} ${_GCC_AUX_PATTERNS}
+.elif ${GCC_CXX_VERSION} == "7"
+_GCC_REQD=		7.0
+_GCC_CXX_TOOHIGH_PATTERNS=	${_GCC_AUX_PATTERNS}
+_GCC_CXX_STD_UNSUPP=	# empty
+.else
+PKG_FAIL_REASON+=	"Unknown GCC_CXX_VERSION ${GCC_CXX_VERSION}"
+.endif # GCC_CXX_VERSION
+
+# Check that the selected GCC version supports the dialects used
+.for _std_ in ${_GCC_CXX_STD_UNSUPP}
+.if !empty(USE_LANGUAGES:M${_std_})
+PKG_FAIL_REASON+=	"GCC_CXX_VERSION ${GCC_CXX_VERSION} does not support ${_std_}"
+.endif
+.endfor
+
+# Check that the GCC version selected through GCC_REQD does not exeed the selected version
+.if !empty(_GCC_CXX_TOOHIGH_PATTERNS:M${_GCC_STRICTEST_REQD})
+PKG_FAIL_REASON+=	"GCC_REQD mandates a higher version (${_GCC_STRICTEST_REQD}) than GCC_CXX_VERSION (${GCC_CXX_VERSION}/${_GCC_REQD})"
+.endif
+.else # not c++
 _GCC_REQD=	${_GCC_STRICTEST_REQD}
+.endif # c++
 
 # Determine whether we require GCC-2.x or GCC-3.x by examining _GCC_REQD.
 _NEED_GCC2?=	no


Home | Main Index | Thread Index | Old Index