]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PATCH v6 1/1] Add --with-multi-buildlist configure option
authorAleksandar Rakic <aleksandar.rakic@htecgroup.com>
Thu, 8 Jan 2026 15:56:23 +0000 (08:56 -0700)
committerJeff Law <jeffrey.law@oss.qualcomm.com>
Thu, 8 Jan 2026 15:59:34 +0000 (08:59 -0700)
This patch introduces a new configure-time option --with-multi-buildlist
to allow fine-grained control over which multilib variants are built.

The option accepts a path to a file containing a list of multilib
directories to be included in the build.  Each line in the file should
contain a single multilib directory name, matching those generated by
the compiler's --print-multi-lib output.

This mechanism is target-independent and enables users to reduce build
time and binary size by excluding unnecessary multilib variants.  It is
especially useful for embedded targets with constrained environments or
vendor-specific requirements.

The option is propagated to both host and target configuration stages,
and used in config-ml.in and gcc/Makefile.in to filter the multilib
list.

Documentation for this feature is added to gcc/doc/install.texi.

/ChangeLog

* config-ml.in: Use with_multi_buildlist to build multidirs.
Skip configuration for subdir returned by
--print-multi-directory.
* configure: Regenerate.
* configure.ac: Source target-specific configuration fragment
for GCC. Pass through with_multi_buildlist to host and target.

gcc/ChangeLog

* Makefile.in: Add with_multi_buildlist for multilib
configuration control. Pass an additional argument to
genmultilib indicating whether --with-multi-buildlist is set
(true or false). Use with_multi_buildlist to filter
multilib directories in fixinc_list.
* configure: Regenerate.
* configure.ac: Restrict the installed fixedincludes multilibs.
* configure.tgt: New file.
* doc/install.texi: Add --with-multi-buildlist configure option
for multilib filtering.
* genmultilib: Document the new eleventh argument indicating
whether --with-multi-buildlist configure option is set (true or
false). Update argument parsing to include this flag before
enable_multilib. Modify reuse rule validation:
- Keep the original error for reuse of nonexistent multilibs
when --with-multi-buildlist is not used.
- Suppress the error only when the new configure option is
active, allowing reuse rules to reference multilibs that are
intentionally excluded from the build.

Signed-off-by: Robert Suchanek <robert.suchanek@imgtec.com>
Signed-off-by: Chao-ying Fu <cfu@mips.com>
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
config-ml.in
configure
configure.ac
gcc/Makefile.in
gcc/configure
gcc/configure.ac
gcc/configure.tgt [new file with mode: 0644]
gcc/doc/install.texi
gcc/genmultilib

index 9cdcae1191da9ff6efd078dc69b145961c2c1919..d184fdc6d8280742b40b62e0f5111b09bf06104c 100644 (file)
@@ -488,6 +488,23 @@ powerpc*-*-* | rs6000*-*-*)
        ;;
 esac
 
+# Use a filtered multilib list if requested.
+
+if [ x$with_multi_buildlist != x ]; then
+  old_multidirs="${multidirs}"
+  if [ ! -f $with_multi_buildlist ]; then
+    echo "config-ml.in: Failed to find $with_multi_buildlist"
+    exit 1
+  fi
+  multidirs=""
+  for x in ${old_multidirs}; do
+    found=`grep "^${x}$" $with_multi_buildlist`
+    if [ -n "$found" ]; then
+      multidirs="${multidirs} ${x}"
+    fi
+  done
+fi
+
 # Remove extraneous blanks from multidirs.
 # Tests like `if [ -n "$multidirs" ]' require it.
 multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'`
@@ -597,7 +614,8 @@ else
 fi
 
 if [ -z "${with_multisubdir}" ]; then
-  ml_subdir=
+  ml_top_subdir=`${CC-gcc} --print-multi-directory 2>/dev/null`
+  ml_subdir=/$ml_top_subdir
   ml_builddotdot=
   : # ml_srcdotdot= # already set
 else
@@ -676,6 +694,11 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
 
   for ml_dir in ${multidirs}; do
 
+    if [ "${ml_dir}" == "${ml_top_subdir}" ]; then
+      echo "Skipping configure in multilib subdir ${ml_dir}"
+      continue
+    fi
+
     if [ "${ml_verbose}" = --verbose ]; then
       echo "Running configure in multilib subdir ${ml_dir}"
       echo "pwd: `${PWDCMD-pwd}`"
index d4e11d4cec3c41d1a5e24b8ee82ace913e3a5928..bb0905df77fad3fbfd79b5de9c69adf83c00c0ae 100755 (executable)
--- a/configure
+++ b/configure
@@ -11760,6 +11760,21 @@ if test x${enable_multilib} = x ; then
   target_configargs="--enable-multilib ${target_configargs}"
 fi
 
+# Source target-specific configuration fragment for GCC
+if test -d ${srcdir}/gcc; then
+  . ${srcdir}/gcc/configure.tgt
+fi
+
+# Pass through with_multi_buildlist to host and target.  'gcc' needs it for the
+# fixed includes which are multilib'd and target libraries need it as they use
+# config-ml.in.
+if test x${with_multi_buildlist} != x ; then
+  target_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${target_configargs}"
+  host_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${host_configargs}"
+fi
+
 # Pass --with-newlib if appropriate.  Note that target_configdirs has
 # changed from the earlier setting of with_newlib.
 if test x${with_newlib} != xno && echo " ${target_configdirs} " | grep " newlib " > /dev/null 2>&1 && test -d ${srcdir}/newlib ; then
index 5edd041bf645bc6c6dae6191b8df385aba5b5703..5b87025677176afd1230be2e6c931c086433810c 100644 (file)
@@ -3830,6 +3830,21 @@ if test x${enable_multilib} = x ; then
   target_configargs="--enable-multilib ${target_configargs}"
 fi
 
+# Source target-specific configuration fragment for GCC
+if test -d ${srcdir}/gcc; then
+  . ${srcdir}/gcc/configure.tgt
+fi
+
+# Pass through with_multi_buildlist to host and target.  'gcc' needs it for the
+# fixed includes which are multilib'd and target libraries need it as they use
+# config-ml.in.
+if test x${with_multi_buildlist} != x ; then
+  target_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${target_configargs}"
+  host_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${host_configargs}"
+fi
+
 # Pass --with-newlib if appropriate.  Note that target_configdirs has
 # changed from the earlier setting of with_newlib.
 if test x${with_newlib} != xno && echo " ${target_configdirs} " | grep " newlib " > /dev/null 2>&1 && test -d ${srcdir}/newlib ; then
index 917d586e572492fffacea005a3e3bfbbbee485de..41b68997172567232fe795e9c41bf36e3815293c 100644 (file)
@@ -653,6 +653,9 @@ else
   endif
 endif
 
+# Multilib control
+with_multi_buildlist = @with_multi_buildlist@
+
 # ------------------------
 # Installation directories
 # ------------------------
@@ -2528,11 +2531,12 @@ s-mlib: $(srcdir)/genmultilib Makefile
            "$(MULTILIB_REQUIRED)" \
            "$(if $(MULTILIB_OSDIRNAMES),,$(MULTIARCH_DIRNAME))" \
            "$(MULTILIB_REUSE)" \
+           "$(if $(with_multi_buildlist),true,false)" \
            "@enable_multilib@" \
            > tmp-mlib.h; \
        else \
          $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' '' \
-           "$(MULTIARCH_DIRNAME)" '' no \
+           "$(MULTIARCH_DIRNAME)" '' 'false' no \
            > tmp-mlib.h; \
        fi
        $(SHELL) $(srcdir)/../move-if-change tmp-mlib.h multilib.h
@@ -3631,10 +3635,23 @@ fixinc_list: s-fixinc_list; @true
 s-fixinc_list : $(GCC_PASSES)
 # Build up a list of multilib directories and corresponding sysroot
 # suffixes, in form sysroot;multilib.
+# Use a filtered multilib list if requested.
        if $(GCC_FOR_TARGET) -print-sysroot-headers-suffix > /dev/null 2>&1; then \
          set -e; for ml in `$(GCC_FOR_TARGET) -print-multi-lib`; do \
            multi_dir=`echo $${ml} | sed -e 's/;.*$$//'`; \
            flags=`echo $${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
+           if [ x$(with_multi_buildlist) != x ]; then \
+             if [ ! -f $(with_multi_buildlist) ]; then \
+               echo "fixinc_list: Failed to find $(with_multi_buildlist)"; \
+               exit 1; \
+             fi; \
+             set +e; \
+             found=`grep "^$${multi_dir}$$" $(with_multi_buildlist)`; \
+             set -e; \
+             if [ -z "$$found" ]; then \
+               continue; \
+             fi; \
+           fi; \
            sfx=`$(GCC_FOR_TARGET) $${flags} -print-sysroot-headers-suffix`; \
            if [ "$${multi_dir}" = "." ]; \
              then multi_dir=""; \
index fd9e3c88363fca88a162931dbc7b52c53409d496..665a88be9531263fb4358f22efbab9593d5a934c 100755 (executable)
@@ -859,6 +859,7 @@ enable_fixed_point
 enable_decimal_float
 DEFAULT_INSNEMIT_PARTITIONS
 DEFAULT_MATCHPD_PARTITIONS
+with_multi_buildlist
 with_float
 with_cpu
 enable_multiarch
@@ -7898,6 +7899,9 @@ $as_echo "$enable_multiarch$ma_msg_suffix" >&6; }
 
 
 
+# needed for restricting the fixedincludes multilibs that we install
+
+
 # default stack clash protection guard size as power of twos in bytes.
 # Please keep these in sync with params.def.
 stk_clash_min=12
@@ -21935,7 +21939,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 21938 "configure"
+#line 21942 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -22041,7 +22045,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 22044 "configure"
+#line 22048 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
index 458f5c9902872b1b9f8e0ee1287769276e7ae55f..ed37f00f021027879fbf69692b7b517f35fe3be1 100644 (file)
@@ -887,6 +887,9 @@ AC_MSG_RESULT($enable_multiarch$ma_msg_suffix)
 AC_SUBST(with_cpu)
 AC_SUBST(with_float)
 
+# needed for restricting the fixedincludes multilibs that we install
+AC_SUBST(with_multi_buildlist)
+
 # default stack clash protection guard size as power of twos in bytes.
 # Please keep these in sync with params.def.
 stk_clash_min=12
diff --git a/gcc/configure.tgt b/gcc/configure.tgt
new file mode 100644 (file)
index 0000000..2c570b8
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- shell-script -*-
+#   Copyright (C) 2025 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not see <http://www.gnu.org/licenses/>.
+
+# This is the target specific configuration file.  This is invoked by the
+# autoconf generated configure script.  Putting it in a separate shell file
+# lets us skip running autoconf when modifying target specific information.
+
index a415898c000c4fb9cc98d69d6b5633913348e96c..54f80308c9e06d4e37806ff7746d3dd74b7ba53e 100644 (file)
@@ -1601,6 +1601,30 @@ medlow code model; rv64ima with lp64 and medany code model
 rv64ima-lp64--;--cmodel=medlow,medany
 @end smallexample
 
+@item --with-multi-buildlist=@var{file}
+Specify a file containing a list of multilib directories to build.
+
+Each line in the file should contain a single multilib directory name,
+as printed by @code{gcc --print-multi-lib}.  Only the listed directories
+will be built and installed.
+
+This option is useful for reducing build time and binary size by
+excluding unnecessary multilib variants.  It is especially beneficial
+for embedded targets or vendor-specific toolchains.
+
+Example file contents:
+
+@smallexample
+mips-r6-hard/lib
+mips-r6-soft/lib32
+mipsel-r6-hard/lib64
+@end smallexample
+
+This option is target-independent and can be used with any architecture
+that supports multilibs.  It is passed to both host and target
+configuration stages and used during fixed includes installation and
+multilib directory generation.
+
 @item --with-endian=@var{endians}
 Specify what endians to use.
 Currently only implemented for sh*-*-*.
index 1367e5d3b7ae0666255832c4aa435986e897cf4e..a00d6d88683fc8c45a821d7b802a2bc605cc2fab 100644 (file)
@@ -88,6 +88,9 @@
 # The optional tenth argument specifies how to reuse multilib for different
 # option sets.
 
+# The eleventh argument specifies whether the --with-multi-buildlist
+# configure option is set (true or false).
+
 # The last option should be "yes" if multilibs are enabled.  If it is not
 # "yes", all GCC multilib dir names will be ".".
 
 #   genmultilib 'm64/m32 mno-app-regs|mcmodel=medany' '64 32 alt'
 #              'mcmodel?medany=mcmodel?medmid' 'm32/mno-app-regs* m32/mcmodel=*'
 #              '' 'm32/!m64/mno-app-regs m32/!m64/mcmodel=medany'
-#              '../lib64 ../lib32 alt' '' '' '' yes
+#              '../lib64 ../lib32 alt' '' '' '' 'false' yes
 # This produces:
 #   ". !m64 !m32 !mno-app-regs !mcmodel=medany;",
 #   "64:../lib64 m64 !m32 !mno-app-regs !mcmodel=medany;",
@@ -139,7 +142,8 @@ osdirnames=$7
 multilib_required=$8
 multiarch=$9
 multilib_reuse=${10}
-enable_multilib=${11}
+with_multi_buildlist=${11}
+enable_multilib=${12}
 
 echo "static const char *const multilib_raw[] = {"
 
@@ -500,7 +504,7 @@ for rrule in ${multilib_reuse}; do
       echo "The rule ${rrule} contains an option absent from MULTILIB_OPTIONS." >&2
       exit 1
     fi
-  else
+  elif ! ${with_multi_buildlist}; then
     echo "The rule ${rrule} is trying to reuse nonexistent multilib." >&2
     exit 1
   fi