This is a work-in-progres, now is the time to shoot holes thru it.

Basically, clang in base comes with libc++, which tends to not be
compatible with stuff compiled with gcc4 or clang from ports.

So I tried designing an interface to choose the most appropriate compiler
for most cases. The only tricky part is that this HAS to plug into modules,
because some modules do choose the compiler for you (e.g., kde5 glue for
instance)

- list CXX11_ARCHS and prop CX11...
allows to do things such as
ONLY_FOR_ARCHS = ${CXX11_ARCHS}
because right now, modern C++ compilers are the ones that support C++11,
even though this might inaccurate at some point. Better name ?
(not set by default, because it might just be that compiling with gcc 4.2.1
may do something reasonable, but not compile all subpackages...)

- WANT_CXX should list the compilers in order of preference (name was
chosen over the more accurate PREFERRED_CXX because, less typing, eh sthen@ ?)
In many cases, this will be
WANT_CXX = base gcc clang
or something like that.
You end up with
CHOSEN_CXX = <actual_choice>
the corresponding choice, as made decided whether your system uses clang
as a base compiler, or whether clang is available as a port, or whether
gcc4 is available as a port.

I renamed an internal variable of modules.port.mk, because
_MODULES_KEEP_GOING is a more accurate name for it.

So far, this interface appears to just drop in for existing usage of
compiler modules.

Again, the names are probably not perfect, but they seem good enough for me.


Index: arch-defines.mk
===================================================================
RCS file: /cvs/ports/infrastructure/mk/arch-defines.mk,v
retrieving revision 1.35
diff -u -p -r1.35 arch-defines.mk
--- arch-defines.mk     24 Apr 2017 09:08:06 -0000      1.35
+++ arch-defines.mk     30 Apr 2017 10:28:11 -0000
@@ -34,8 +34,10 @@ CLANG_ARCHS = aarch64
 # as well as available for PROPERTIES checks.  XXX list currently inaccurate
 LLVM_ARCHS = aarch64 amd64 arm i386 powerpc mips64 mips64el sparc64
 
+CXX11_ARCHS = ${LLVM_ARCHS} hppa
+
 .for PROP in ALL APM BE LE LP64 CLANG GCC4 GCC3 MONO LLVM \
-                           OCAML_NATIVE OCAML_NATIVE_DYNLINK GO
+                                  CXX11 OCAML_NATIVE OCAML_NATIVE_DYNLINK GO
 .  for A B in ${MACHINE_ARCH} ${ARCH}
 .    if !empty(${PROP}_ARCHS:M$A) || !empty(${PROP}_ARCHS:M$B)
 PROPERTIES += ${PROP:L}
Index: bsd.port.mk
===================================================================
RCS file: /cvs/ports/infrastructure/mk/bsd.port.mk,v
retrieving revision 1.1342
diff -u -p -r1.1342 bsd.port.mk
--- bsd.port.mk 29 Apr 2017 14:49:38 -0000      1.1342
+++ bsd.port.mk 30 Apr 2017 10:28:11 -0000
@@ -270,23 +270,6 @@ _ARCH_DEFINES_INCLUDED = Done
 .  include "${PORTSDIR}/infrastructure/mk/arch-defines.mk"
 .endif
 
-USE_CXX ?= No
-.if ${USE_CXX:L:Mc++11}
-.  if ${PROPERTIES:Mclang}
-# nothing to do
-.  elif ${PROPERTIES:Mllvm}
-# prefer llvm module
-MODULES +=     lang/clang
-MODCLANG_ARCH ?=       *
-MODCLANG_LANGS +=      c++
-.  else
-# try gcc4
-MODULES +=             gcc4
-MODGCC4_LANGS +=               c++
-MODGCC4_ARCHS ?=               *
-.  endif
-.endif
-
 .if ${CONFIGURE_STYLE:L:Mautomake} || ${CONFIGURE_STYLE:L:Mautoconf} || \
        ${CONFIGURE_STYLE:L:Mautoupdate}
 .  if !${CONFIGURE_STYLE:L:Mgnu}
@@ -312,6 +295,8 @@ _MODULES_DONE =
 .  include "${PORTSDIR}/infrastructure/mk/modules.port.mk"
 .endif
 
+WANT_CXX ?= None
+CHOSEN_CXX ?= None
 ###
 ### Variable setup that can happen after modules
 ###
Index: modules.port.mk
===================================================================
RCS file: /cvs/ports/infrastructure/mk/modules.port.mk,v
retrieving revision 1.6
diff -u -p -r1.6 modules.port.mk
--- modules.port.mk     17 Apr 2007 15:22:46 -0000      1.6
+++ modules.port.mk     30 Apr 2017 10:28:11 -0000
@@ -26,14 +26,14 @@
 # Recursive module support
 #
 
-.undef _MODULES_DONE_ON_THIS_ROUND
+.undef _MODULES_KEEP_GOING
 .for _m in ${MODULES:L}
 .  if "${_m:M*/*}" != ""
 .    for _d in ${PORTSDIR_PATH:S/:/ /g}
 .      if empty(_MODULES_DONE:M${_m}) && exists(${_d}/${_m}/${_m:T}.port.mk)
 .        include "${_d}/${_m}/${_m:T}.port.mk"
 _MODULES_DONE += ${_m}
-_MODULES_DONE_ON_THIS_ROUND = Yep
+_MODULES_KEEP_GOING = Yep
 .      endif
 .    endfor
 .  endif
@@ -41,14 +41,36 @@ _MODULES_DONE_ON_THIS_ROUND = Yep
 .    if exists(${PORTSDIR}/infrastructure/mk/${_m}.port.mk)
 .      include "${PORTSDIR}/infrastructure/mk/${_m}.port.mk"
 _MODULES_DONE += ${_m}
-_MODULES_DONE_ON_THIS_ROUND = Yep
+_MODULES_KEEP_GOING = Yep
 .    else
 ERRORS += "Fatal: Missing support for module ${_m}."
 .    endif
 .  endif
 .endfor
 
+# support for preferred compiler
+.if defined(WANT_CXX) && !defined(CHOSEN_CXX)
+.  for i in ${WANT_CXX}
+.    if !defined(CHOSEN_CXX)
+.      if "$i" == "base" && ${PROPERTIES:Mclang}
+CHOSEN_CXX = base
+.      elif "$i" == "clang" && ${PROPERTIES:Mllvm}
+MODULES +=     lang/clang
+MODCLANG_ARCH ?=       *
+MODCLANG_LANGS +=      c++
+CHOSEN_CXX = clang
+_MODULES_KEEP_GOING = Yep
+.      elif "$i" == "gcc" && ${PROPERTIES:Mcxx11}
+MODULES +=             gcc4
+MODGCC4_LANGS +=               c++
+MODGCC4_ARCHS ?=               *
+CHOSEN_CXX = gcc
+_MODULES_KEEP_GOING = Yep
+.      endif
+.    endif
+.  endfor
+.endif
 # Tail recursion
-.if defined(_MODULES_DONE_ON_THIS_ROUND)
+.if defined(_MODULES_KEEP_GOING)
 .  include "${PORTSDIR}/infrastructure/mk/modules.port.mk"
 .endif

Reply via email to