On Fri, 09 Nov 2018 07:07:06 PST (-0800), ol...@adacore.com wrote:
Richard,

Olivier tells me he talked to you briefly at the Cauldron about allowing
custom multilib sets to be configured from custom Makefile fragments
supplied at configure time, and that you was somewhat receptive to the
idea.  I have implemented this as follows, for ARM targets only so far,
using "@/path/name" in the argument to --with-multilib-list to mean
/path/name is to be used as a multilib-list Makefile fragment.

Does this look like an acceptable interface?  Is it ok as far as ARM
maintainers are concerned?

Any objections from maintainers of other targets that support
--with-multilib-list (or from anyone else) to the syntax, to the
implementation, or to extending this possibility to their ports?

We've had requests for this feature from users of the RISC-V port, but haven't had time to look into it. One wrinkle in RISC-V land is that we have a script in GCC that generates our fragments, so I'm not sure if this is exactly what we want. It's certainly better than our current "just patch GCC" flow, though!

for  gcc/ChangeLog

        * config.gcc (tmake_file): Add /path/name to tmake_file for
        each @/path/name in --with-multilib-list on arm-*-* targets.
        * configure.ac: Accept full pathnames in tmake_file.
        * configure: Rebuilt.
        * doc/install.texi (with-multilib-list): Document it.
---
 gcc/config.gcc       |   13 +++++++++++++
 gcc/configure        |    9 ++++++---
 gcc/configure.ac     |    5 ++++-
 gcc/doc/install.texi |   22 +++++++++++++++-------
 4 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 7578ff03825e..f1363c41f989 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -3998,6 +3998,19 @@ case "${target}" in
                                        aprofile|rmprofile)
                                                
tmake_profile_file="arm/t-multilib"
                                                ;;
+                                       @/*)
+                                               ml=`echo "X$arm_multilib" | sed 
'1s,^X@,,'`
+                                               if test -f "${ml}"; then
+                                                       tmake_file="${tmake_file} 
${ml}"
+                                               else
+                                                       echo "Error: ${ml} does not 
exist" >&2
+                                                       exit 1
+                                               fi
+                                               ;;
+                                       @*)
+                                               echo "Error: multilib config file must 
start with /" >&2
+                                               exit 1
+                                               ;;
                                        *)
                                                echo "Error: 
--with-multilib-list=${with_multilib_list} not supported." 1>&2
                                                exit 1
diff --git a/gcc/configure b/gcc/configure
index b814484ea25b..5f15c7a1ff02 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -12244,7 +12244,10 @@ done
 tmake_file_=
 for f in ${tmake_file}
 do
-       if test -f ${srcdir}/config/$f
+       if test -n `echo "X$f" | sed -n '1s,^X/.*,/,p` && test -f "$f"
+       then
+               tmake_file_="${tmake_file_} $f"
+       elif test -f ${srcdir}/config/$f
        then
                tmake_file_="${tmake_file_} \$(srcdir)/config/$f"
        fi
@@ -18572,7 +18575,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18575 "configure"
+#line 18578 "configure"
 #include "confdefs.h"
#if HAVE_DLFCN_H
@@ -18678,7 +18681,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18681 "configure"
+#line 18684 "configure"
 #include "confdefs.h"
#if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 59585912556b..99a3e6f8f52f 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -1940,7 +1940,10 @@ done
 tmake_file_=
 for f in ${tmake_file}
 do
-       if test -f ${srcdir}/config/$f
+       if test -n `echo "X$f" | sed -n '1s,^X/.*,/,p` && test -f "$f"
+       then
+               tmake_file_="${tmake_file_} $f"
+       elif test -f ${srcdir}/config/$f
        then
                tmake_file_="${tmake_file_} \$(srcdir)/config/$f"
        fi
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index be9b07b5d23b..fd19fc590ec8 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1078,13 +1078,21 @@ values and meaning for each target is given below.
@table @code
 @item arm*-*-*
-@var{list} is a comma separated list of @code{aprofile} and @code{rmprofile}
-to build multilibs for A or R and M architecture profiles respectively.  Note
-that, due to some limitation of the current multilib framework, using the
-combined @code{aprofile,rmprofile} multilibs selects in some cases a less
-optimal multilib than when using the multilib profile for the architecture
-targetted.  The special value @code{default} is also accepted and is equivalent
-to omitting the option, ie. only the default run-time library will be enabled.
+@var{list} is a comma separated list of @code{aprofile} and
+@code{rmprofile} to build multilibs for A or R and M architecture
+profiles respectively.  Note that, due to some limitation of the current
+multilib framework, using the combined @code{aprofile,rmprofile}
+multilibs selects in some cases a less optimal multilib than when using
+the multilib profile for the architecture targetted.  The special value
+@code{default} is also accepted and is equivalent to omitting the
+option, ie. only the default run-time library will be enabled.
+
+@var{list} may also contain @code{@@/path/name}, to use the multilib
+configuration Makefile fragment @file{/path/name}.  Such files enable
+custom, user-chosen multilib lists to be configured.  Whether multiple
+such files can be used together depends on the contents of the supplied
+files.  See @file{gcc/config/arm/t-*profile} for examples of what such
+Makefile fragments ought to look like.
The table below gives the combination of ISAs, architectures, FPUs and
 floating-point ABIs for which multilibs are built for each accepted value.

--
Alexandre Oliva, freedom fighter   https://FSFLA.org/blogs/lxo
Be the change, be Free!         FSF Latin America board member
GNU Toolchain Engineer                Free Software Evangelist
Hay que enGNUrecerse, pero sin perder la terGNUra jamás-GNUChe

Reply via email to