[PATCH v6 1/1] Add --with-multi-buildlist configure option

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>
This commit is contained in:
Aleksandar Rakic
2026-01-08 08:56:23 -07:00
committed by Jeff Law
parent 92d621d9ea
commit 6ae5a2a6ba
9 changed files with 132 additions and 7 deletions

View 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}`"

15
configure vendored
View File

@@ -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

View 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

View 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=""; \

8
gcc/configure vendored
View File

@@ -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

View 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

20
gcc/configure.tgt Normal file
View File

@@ -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.

View 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*-*-*.

View 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 ".".
@@ -108,7 +111,7 @@
# 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