On Nov 9, 2018, "Richard Earnshaw (lists)" <richard.earns...@arm.com> wrote:
> - I'm not sure if we really want to allow combinations of an arbitrary > multilib config with the builtin configurations. Those are tricky > enough to get right as it is, and requests to support additional libs as > well as those with changes to these makefile fragments might be an > issue. As such, I think I'd want to say that you either use the builtin > lists *or* you supply your own fragment. diff --git a/gcc/config.gcc b/gcc/config.gcc index f1363c41f989..20c2765d186f 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -3991,6 +3991,7 @@ case "${target}" in # Add extra multilibs if test "x$with_multilib_list" != x; then + ml= arm_multilibs=`echo $with_multilib_list | sed -e 's/,/ /g'` if test "x${arm_multilibs}" != xdefault ; then for arm_multilib in ${arm_multilibs}; do @@ -4031,6 +4032,9 @@ case "${target}" in || test "x$with_mode" != x ; then echo "Error: You cannot use any of --with-arch/cpu/fpu/float/mode with --with-multilib-list=${with_multilib_list}" 1>&2 exit 1 + elif test "x$ml" != x ; then + echo "Error: You cannot use builtin multilib profiles along with custom ones" 1>&2 + exit 1 fi # But pass the default value for float-abi # through to the multilib selector > - I'd also be concerned about implying that this interface into the > compiler build system is in any way stable, so I think we'd want to > document explicitly that makefile fragments supplied this way may have > to be tailored to a specific release of GCC. diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index fd19fc590ec8..925a120ae7f4 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1087,12 +1087,23 @@ 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 +@var{list} may instead 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. +files. See @file{gcc/config/arm/t-multilib} and +@file{gcc/config/arm/t-*profile} for examples of what such Makefile +fragments might look like for this version of GCC. The macros expected +to be defined in these fragments are not stable across GCC releases, so +make sure they define the @code{MULTILIB}-related macros expected by +the version of GCC you are building. +@ifnothtml +@xref{Target Fragment,, Target Makefile Fragments, gccint, GNU Compiler +Collection (GCC) Internals}. +@end ifnothtml +@ifhtml +See ``Target Makefile Fragments'' in the internals manual. +@end ifhtml The table below gives the combination of ISAs, architectures, FPUs and floating-point ABIs for which multilibs are built for each accepted value. > Given the second point, there's nothing to stop a user copying the > internal makefile fragments into their own fragment and then adjusting > it to work with their additional features; so I don't think the first > restriction is too onerous. *nod*. I'm having second thoughts on specifying external files with a full pathname, though, as it might lead to accidental GPL violations. Having the fragments in the source tree won't guarantee they are included in corresponding sources, but at least for some workflows it won't require significant procedural changes to get them included in corresponding sources. 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 | 17 +++++++++++++++++ gcc/configure | 9 ++++++--- gcc/configure.ac | 5 ++++- gcc/doc/install.texi | 33 ++++++++++++++++++++++++++------- 4 files changed, 53 insertions(+), 11 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index 7578ff03825e..20c2765d186f 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -3991,6 +3991,7 @@ case "${target}" in # Add extra multilibs if test "x$with_multilib_list" != x; then + ml= arm_multilibs=`echo $with_multilib_list | sed -e 's/,/ /g'` if test "x${arm_multilibs}" != xdefault ; then for arm_multilib in ${arm_multilibs}; do @@ -3998,6 +3999,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 @@ -4018,6 +4032,9 @@ case "${target}" in || test "x$with_mode" != x ; then echo "Error: You cannot use any of --with-arch/cpu/fpu/float/mode with --with-multilib-list=${with_multilib_list}" 1>&2 exit 1 + elif test "x$ml" != x ; then + echo "Error: You cannot use builtin multilib profiles along with custom ones" 1>&2 + exit 1 fi # But pass the default value for float-abi # through to the multilib selector 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..925a120ae7f4 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1078,13 +1078,32 @@ 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 instead 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-multilib} and +@file{gcc/config/arm/t-*profile} for examples of what such Makefile +fragments might look like for this version of GCC. The macros expected +to be defined in these fragments are not stable across GCC releases, so +make sure they define the @code{MULTILIB}-related macros expected by +the version of GCC you are building. +@ifnothtml +@xref{Target Fragment,, Target Makefile Fragments, gccint, GNU Compiler +Collection (GCC) Internals}. +@end ifnothtml +@ifhtml +See ``Target Makefile Fragments'' in the internals manual. +@end ifhtml 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