[v2] Get rid of `with_multisrctop`, and `MULTISRCTOP`
Commit Message
See the new comment in `config-ml.in`, and the email chain starting with
[1].
The short story is that I am trying to do a bunch of build system
improvements to GCC to make it easier to build GCC's runtime libraries
separately (see [1] for why). As part of this, I started looking at the
current multilib implementation, with a hunch that things could be
simpler, and with those simplifications, we could refine the idiomatic
division of labor between the outer and inner build systems in a way
that I think would be just better, and also would make the separate or
"per component" builds I want to do more maintainable.
In that linked thread I found variable/mechanism that looked unused, and
after some back and forth with Joseph Myers, we came to an agreement
that since GNU Make was mandatory now, and thus VPATH support was
assumed, there was no need to do these convoluted symlink tree things to
unnaturally allow multilib to get away with `srcdir = objdir` building.
(When indeed, `srcdir != objdir_for_machine1 != objdir_for_machine2` is
multilib in a nutshell.)
The last (as of this patch) email in the chain is Joseph writing:
> I think it's reasonable to eliminate such a workaround, but I don't know
> how the newlib community feels, should they wish to update the shared
> toplevel build infrastructure with changes from GCC.
This email is thus me submitting the multilib version of this change
first, to ask you all that question.
If our reasoning looks correct, and you see no reason to support these
no-VPATH workarounds either, then we have our concensus! I think we can
land this change in both repos (GCC, newlib-cygwin), in either order (no
repo need wait on the other repo).
N.B. I am not exactly sure how to test this. I have tested that it
doesn't break the a non-multilib build of newlib. But when I try to do a
multilib build in this repo with the toplevel makefile, it doesn't want
build anything.
config/ChangeLog:
* multi.m4: Simplify, no more srcdir = . special case needed.
ChangeLog:
* newlib/acinclude.m4: Simplify, no more srcdir = . special case needed.
* symlink-tree: Removed. It is no longer needed by anything.
* MAINTAINERS: Remove symlink-tree entry.
* etc/update-copyright.py: Remove symlink-tree entry.
* src-release: Remove symlink-tree entry.
* config-ml.in: Simplify a bunch, and reword docs to explain
status quo: It's simpler than past, but can't yet forget about past
until tech debt is gone.
* libgloss/configure: Regenerate.
* newlib/configure: Regenerate.
[1]: https://sourceware.org/pipermail/gcc-patches/2025-August/691963.html
[2]: https://blog.obsidian.systems/compiler-bootstrapping-in-nixpkgs/
[3]: https://sourceware.org/pipermail/gcc-patches/2025-August/692233.html
Signed-off-by: John Ericson <git@JohnEricson.me>
---
MAINTAINERS | 4 --
config-ml.in | 110 ++++++++++++----------------------------
config/multi.m4 | 13 +----
etc/update-copyright.py | 1 -
libgloss/Makefile.in | 1 -
libgloss/configure | 13 +----
multilib.am | 1 -
newlib/Makefile.in | 1 -
newlib/acinclude.m4 | 12 +----
newlib/configure | 23 ++-------
src-release | 2 +-
symlink-tree | 78 ----------------------------
12 files changed, 42 insertions(+), 217 deletions(-)
delete mode 100755 symlink-tree
Comments
Any further feedback on this? Should I just go ahead and remake the patch to GCC likewise, too?
John
On Wed, Aug 13, 2025, at 4:07 PM, John Ericson wrote:
> See the new comment in `config-ml.in`, and the email chain starting with
> [1].
>
> The short story is that I am trying to do a bunch of build system
> improvements to GCC to make it easier to build GCC's runtime libraries
> separately (see [1] for why). As part of this, I started looking at the
> current multilib implementation, with a hunch that things could be
> simpler, and with those simplifications, we could refine the idiomatic
> division of labor between the outer and inner build systems in a way
> that I think would be just better, and also would make the separate or
> "per component" builds I want to do more maintainable.
>
> In that linked thread I found variable/mechanism that looked unused, and
> after some back and forth with Joseph Myers, we came to an agreement
> that since GNU Make was mandatory now, and thus VPATH support was
> assumed, there was no need to do these convoluted symlink tree things to
> unnaturally allow multilib to get away with `srcdir = objdir` building.
> (When indeed, `srcdir != objdir_for_machine1 != objdir_for_machine2` is
> multilib in a nutshell.)
>
> The last (as of this patch) email in the chain is Joseph writing:
>
> > I think it's reasonable to eliminate such a workaround, but I don't know
> > how the newlib community feels, should they wish to update the shared
> > toplevel build infrastructure with changes from GCC.
>
> This email is thus me submitting the multilib version of this change
> first, to ask you all that question.
>
> If our reasoning looks correct, and you see no reason to support these
> no-VPATH workarounds either, then we have our concensus! I think we can
> land this change in both repos (GCC, newlib-cygwin), in either order (no
> repo need wait on the other repo).
>
> N.B. I am not exactly sure how to test this. I have tested that it
> doesn't break the a non-multilib build of newlib. But when I try to do a
> multilib build in this repo with the toplevel makefile, it doesn't want
> build anything.
>
> config/ChangeLog:
>
> * multi.m4: Simplify, no more srcdir = . special case needed.
>
> ChangeLog:
>
> * newlib/acinclude.m4: Simplify, no more srcdir = . special case needed.
> * symlink-tree: Removed. It is no longer needed by anything.
> * MAINTAINERS: Remove symlink-tree entry.
> * etc/update-copyright.py: Remove symlink-tree entry.
> * src-release: Remove symlink-tree entry.
> * config-ml.in: Simplify a bunch, and reword docs to explain
> status quo: It's simpler than past, but can't yet forget about past
> until tech debt is gone.
> * libgloss/configure: Regenerate.
> * newlib/configure: Regenerate.
>
> [1]: https://sourceware.org/pipermail/gcc-patches/2025-August/691963.html
> [2]: https://blog.obsidian.systems/compiler-bootstrapping-in-nixpkgs/
> [3]: https://sourceware.org/pipermail/gcc-patches/2025-August/692233.html
>
> Signed-off-by: John Ericson <git@JohnEricson.me>
> ---
> MAINTAINERS | 4 --
> config-ml.in | 110 ++++++++++++----------------------------
> config/multi.m4 | 13 +----
> etc/update-copyright.py | 1 -
> libgloss/Makefile.in | 1 -
> libgloss/configure | 13 +----
> multilib.am | 1 -
> newlib/Makefile.in | 1 -
> newlib/acinclude.m4 | 12 +----
> newlib/configure | 23 ++-------
> src-release | 2 +-
> symlink-tree | 78 ----------------------------
> 12 files changed, 42 insertions(+), 217 deletions(-)
> delete mode 100755 symlink-tree
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index dd8601b4f..a479ea3d9 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -73,10 +73,6 @@ ltconfig; ltmain.sh; ltcf-*.sh
> move-if-change
> Send bug reports and patches to bug-gnulib@gnu.org.
>
> -symlink-tree
> - gcc: http://gcc.gnu.org
> - See libiberty.
> -
> newlib/; libgloss/
> http://sourceware.org/newlib/
> Patches to newlib@sourceware.org.
> diff --git a/config-ml.in b/config-ml.in
> index 5e519942b..56b6abae2 100644
> --- a/config-ml.in
> +++ b/config-ml.in
> @@ -30,28 +30,19 @@
> # It is advisable to support a few --enable/--disable options to let the
> # user select which libraries s/he really wants.
> #
> -# Subdirectories wishing to use multilib should put the following lines
> +# Subdirectories wishing to use multilib should put the following line
> # in the "post-target" section of configure.ac.
> #
> -# if [ "${srcdir}" = "." ] ; then
> -# if [ "${with_target_subdir}" != "." ] ; then
> -# . ${with_multisrctop}../../config-ml.in
> -# else
> -# . ${with_multisrctop}../config-ml.in
> -# fi
> -# else
> -# . ${srcdir}/../config-ml.in
> -# fi
> -#
> +# . ${srcdir}/../config-ml.in
> #
> # Things are complicated because 6 separate cases must be handled:
> # 2 (native, cross) x 3 (absolute-path, relative-not-dot, dot) = 6.
> #
> -# srcdir=. is special. It must handle make programs that don't handle VPATH.
> -# To implement this, a symlink tree is built for each library and for each
> -# multilib subdir.
> +# srcdir=. was formerly special. We used to want to handle make
> +# programs that don't handle VPATH. To implement this, a symlink tree
> +# was built for each library and for each multilib subdir.
> #
> -# The build tree is layed out as
> +# The build tree was laid out as
> #
> # ./
> # newlib
> @@ -60,6 +51,24 @@
> # m68881/
> # newlib
> #
> +# In such a symlink tree, the source code *files* of newlib were linked
> +# into each location, but the "newlib" directories themselves were
> +# actual separate directories, to hold different different build
> +# artifacts in each case. Accordingly ${srcdir}/.. would not work as
> +# intended, because instead of pointing to the top-level source
> +# directory, it would point to one of the parent build directories (e.g.
> +# "m68881" or "m68020") in the example above.
> +#
> +# Now, however, GNU Make is required, and GNU Make always supports
> +# VPATH. We therefore dropped support for these symlink trees. And
> +# accordingly, we can know that ${srcdir}/.. always does what we expect
> +# in all supported configurations.
> +#
> +# This will open the door to many many further simplifications of the
> +# multilib infrastructure. These simplifications are not yet
> +# implemented, however. Until they are, and the dead code removed, this
> +# historical information should stay in this file.
> +#
> # The nice feature about this arrangement is that inter-library references
> # in the build tree work without having to care where you are. Note that
> # inter-library references also work in the source tree because symlink trees
> @@ -72,14 +81,9 @@
> # Configure variables:
> # ${with_target_subdir} = "." for native, or ${target_alias} for cross.
> # Set by top level Makefile.
> -# ${with_multisrctop} = how many levels of multilibs there are in the source
> -# tree. It exists to handle the case of configuring in the source tree:
> -# ${srcdir} is not constant.
> # ${with_multisubdir} = name of multilib subdirectory (eg: m68020/m68881).
> #
> # Makefile variables:
> -# MULTISRCTOP = number of multilib levels in source tree (+1 if cross)
> -# (FIXME: note that this is different than ${with_multisrctop}. Check out.).
> # MULTIBUILDTOP = number of multilib levels in build tree
> # MULTIDIRS = list of multilib subdirs (eg: m68000 m68020 ...)
> # (only defined in each library's main Makefile).
> @@ -101,7 +105,6 @@
>
> Makefile=${ac_file-Makefile}
> ml_config_shell=${CONFIG_SHELL-/bin/sh}
> -ml_realsrcdir=${srcdir}
>
> # Scan all the arguments and set all the ones we need.
>
> @@ -188,23 +191,8 @@ if [ "${enable_multilib}" = yes ]; then
> # into one file, but it does leave us with having to perform this test.
> ml_toplevel_p=no
> if [ -z "${with_multisubdir}" ]; then
> - if [ "${srcdir}" = "." ]; then
> - # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
> - # ${with_target_subdir} = "." for native, otherwise target alias.
> - if [ "${with_target_subdir}" = "." ]; then
> - if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
> - ml_toplevel_p=yes
> - fi
> - else
> - if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then
> - ml_toplevel_p=yes
> - fi
> - fi
> - else
> - # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
> - if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
> - ml_toplevel_p=yes
> - fi
> + if [ -f ${srcdir}/../config-ml.in ]; then
> + ml_toplevel_p=yes
> fi
> fi
>
> @@ -565,36 +553,20 @@ mv Makefile.tem ${Makefile}
> fi # ${ml_toplevel_p} = yes
>
> if [ "${ml_verbose}" = --verbose ]; then
> - echo "Adding multilib support to ${Makefile} in ${ml_realsrcdir}"
> + echo "Adding multilib support to ${Makefile} in ${srcdir}"
> if [ "${ml_toplevel_p}" = yes ]; then
> echo "multidirs=${multidirs}"
> fi
> echo "with_multisubdir=${with_multisubdir}"
> fi
>
> -if [ "${srcdir}" = "." ]; then
> - if [ "${with_target_subdir}" != "." ]; then
> - ml_srcdotdot="../"
> - else
> - ml_srcdotdot=""
> - fi
> -else
> - ml_srcdotdot=""
> -fi
> -
> if [ -z "${with_multisubdir}" ]; then
> ml_subdir=
> ml_builddotdot=
> - : # ml_srcdotdot= # already set
> else
> ml_subdir="/${with_multisubdir}"
> # The '[^/][^/]*' appears that way to work around a SunOS sed bug.
> ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/
> - if [ "$srcdir" = "." ]; then
> - ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot}
> - else
> - : # ml_srcdotdot= # already set
> - fi
> fi
>
> if [ "${ml_toplevel_p}" = yes ]; then
> @@ -606,8 +578,8 @@ else
> fi
>
> # TOP is used by newlib and should not be used elsewhere for this purpose.
> -# MULTI{SRC,BUILD}TOP are the proper ones to use. MULTISRCTOP is empty
> -# when srcdir != builddir. MULTIBUILDTOP is always some number of ../'s.
> +# MULTIBUILDTOP are the proper ones to use.
> +# MULTIBUILDTOP is always some number of ../'s.
> # FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can
> # delete TOP. Newlib may wish to continue to use TOP for its own purposes
> # of course.
> @@ -628,7 +600,6 @@ fi
> # options).
>
> sed -e "s:^TOP[ ]*=[ ]*\([./]*\)[ ]*$:TOP = ${ml_builddotdot}\1:" \
> - -e "s:^MULTISRCTOP[ ]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \
> -e "s:^MULTIBUILDTOP[ ]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \
> -e "s:^MULTIDIRS[ ]*=.*$:MULTIDIRS = ${multidirs}:" \
> -e "s:^MULTISUBDIR[ ]*=.*$:MULTISUBDIR = ${ml_subdir}:" \
> @@ -692,24 +663,8 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
>
> case ${srcdir} in
> ".")
> - echo "Building symlink tree in `${PWDCMD-pwd}`/${ml_dir}/${ml_libdir}"
> - if [ "${with_target_subdir}" != "." ]; then
> - ml_unsubdir="../"
> - else
> - ml_unsubdir=""
> - fi
> - (cd ${ml_dir}/${ml_libdir};
> - ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "")
> - if [ -f ${ml_dir}/${ml_libdir}/${Makefile} ]; then
> - if [ x"${MAKE}" = x ]; then
> - (cd ${ml_dir}/${ml_libdir}; make distclean)
> - else
> - (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean)
> - fi
> - fi
> - ml_newsrcdir="."
> - ml_srcdiroption=
> - multisrctop=${dotdot}
> + echo "Multilib builds with srcdir = objdir are no longer supported. Please use a separate objdir."
> + exit 1
> ;;
> *)
> case "${srcdir}" in
> @@ -721,7 +676,6 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
> ;;
> esac
> ml_srcdiroption="-srcdir=${ml_newsrcdir}"
> - multisrctop=
> ;;
> esac
>
> @@ -867,7 +821,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
> fi
>
> if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
> - --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
> + --with-multisubdir=${ml_dir} \
> "${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
> true
> else
> diff --git a/config/multi.m4 b/config/multi.m4
> index 5b62ecc0a..5f033284f 100644
> --- a/config/multi.m4
> +++ b/config/multi.m4
> @@ -23,18 +23,10 @@ AC_ARG_ENABLE(multilib,
> [multilib=yes])
>
> # We may get other options which we leave undocumented:
> -# --with-target-subdir, --with-multisrctop, --with-multisubdir
> +# --with-target-subdir, --with-multisubdir
> # See config-ml.in if you want the gory details.
>
> -if test "$srcdir" = "."; then
> - if test "$with_target_subdir" != "."; then
> - multi_basedir="$srcdir/$with_multisrctop../$2"
> - else
> - multi_basedir="$srcdir/$with_multisrctop$2"
> - fi
> -else
> - multi_basedir="$srcdir/$2"
> -fi
> +multi_basedir="$srcdir/$2"
> AC_SUBST(multi_basedir)
>
> # Even if the default multilib is not a cross compilation,
> @@ -57,7 +49,6 @@ srcdir="$srcdir"
> host="$host"
> target="$target"
> with_multisubdir="$with_multisubdir"
> -with_multisrctop="$with_multisrctop"
> with_target_subdir="$with_target_subdir"
> ac_configure_args="${multilib_arg} ${ac_configure_args}"
> multi_basedir="$multi_basedir"
> diff --git a/etc/update-copyright.py b/etc/update-copyright.py
> index 7f605d058..df7c83671 100755
> --- a/etc/update-copyright.py
> +++ b/etc/update-copyright.py
> @@ -96,7 +96,6 @@ class GenericFilter:
> 'mkinstalldirs',
> 'move-if-change',
> 'shlibpath.m4',
> - 'symlink-tree',
> 'ylwrap',
>
> # Skip FSF mission statement, etc.
> diff --git a/libgloss/Makefile.in b/libgloss/Makefile.in
> index 5146a7880..212d74ed8 100644
> --- a/libgloss/Makefile.in
> +++ b/libgloss/Makefile.in
> @@ -2139,7 +2139,6 @@ FLAGS_TO_PASS = \
> "INSTALL_DATA=$(INSTALL_DATA)" \
> "DESTDIR=$(DESTDIR)"
>
> -MULTISRCTOP =
> MULTIBUILDTOP =
> MULTIDIRS =
> MULTISUBDIR =
> diff --git a/libgloss/configure b/libgloss/configure
> index ba071824b..1c47f72ea 100755
> --- a/libgloss/configure
> +++ b/libgloss/configure
> @@ -5652,18 +5652,10 @@ fi
>
>
> # We may get other options which we leave undocumented:
> -# --with-target-subdir, --with-multisrctop, --with-multisubdir
> +# --with-target-subdir, --with-multisubdir
> # See config-ml.in if you want the gory details.
>
> -if test "$srcdir" = "."; then
> - if test "$with_target_subdir" != "."; then
> - multi_basedir="$srcdir/$with_multisrctop../.."
> - else
> - multi_basedir="$srcdir/$with_multisrctop.."
> - fi
> -else
> - multi_basedir="$srcdir/.."
> -fi
> +multi_basedir="$srcdir/.."
>
>
> # Even if the default multilib is not a cross compilation,
> @@ -6616,7 +6608,6 @@ srcdir="$srcdir"
> host="$host"
> target="$target"
> with_multisubdir="$with_multisubdir"
> -with_multisrctop="$with_multisrctop"
> with_target_subdir="$with_target_subdir"
> ac_configure_args="${multilib_arg} ${ac_configure_args}"
> multi_basedir="$multi_basedir"
> diff --git a/multilib.am b/multilib.am
> index 5c98b69bd..0c4e3283e 100644
> --- a/multilib.am
> +++ b/multilib.am
> @@ -10,7 +10,6 @@
> ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> ## GNU General Public License for more details.
>
> -MULTISRCTOP =
> MULTIBUILDTOP =
> MULTIDIRS =
> MULTISUBDIR =
> diff --git a/newlib/Makefile.in b/newlib/Makefile.in
> index c5492c6b6..c16ab2626 100644
> --- a/newlib/Makefile.in
> +++ b/newlib/Makefile.in
> @@ -4305,7 +4305,6 @@ TARG_INCLUDE_CP_DIR = \
> if (cd $$srcdir 2>/dev/null && [ "`echo *.h`" != "*.h" ]); then cp $$srcdir/*.h $$dstdir/; fi
>
> CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
> -MULTISRCTOP =
> MULTIBUILDTOP =
> MULTIDIRS =
> MULTISUBDIR =
> diff --git a/newlib/acinclude.m4 b/newlib/acinclude.m4
> index 19301289f..3ba0fa01f 100644
> --- a/newlib/acinclude.m4
> +++ b/newlib/acinclude.m4
> @@ -94,19 +94,11 @@ AC_ARG_ENABLE(newlib-fno-builtin,
>
>
> dnl We may get other options which we don't document:
> -dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
> +dnl --with-target-subdir, --with-multisubdir
>
> test -z "[$]{with_target_subdir}" && with_target_subdir=.
>
> -if test "[$]{srcdir}" = "."; then
> - if test "[$]{with_target_subdir}" != "."; then
> - newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
> - else
> - newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
> - fi
> -else
> - newlib_basedir="[$]{srcdir}/$1"
> -fi
> +newlib_basedir="[$]{srcdir}/$1"
> AC_SUBST(newlib_basedir)
>
> abs_newlib_basedir=`cd "${newlib_basedir}" && pwd`
> diff --git a/newlib/configure b/newlib/configure
> index 33a2ed1c5..3219f0366 100755
> --- a/newlib/configure
> +++ b/newlib/configure
> @@ -2648,18 +2648,10 @@ fi
>
>
> # We may get other options which we leave undocumented:
> -# --with-target-subdir, --with-multisrctop, --with-multisubdir
> +# --with-target-subdir, --with-multisubdir
> # See config-ml.in if you want the gory details.
>
> -if test "$srcdir" = "."; then
> - if test "$with_target_subdir" != "."; then
> - multi_basedir="$srcdir/$with_multisrctop../.."
> - else
> - multi_basedir="$srcdir/$with_multisrctop.."
> - fi
> -else
> - multi_basedir="$srcdir/.."
> -fi
> +multi_basedir="$srcdir/.."
>
>
> # Even if the default multilib is not a cross compilation,
> @@ -4872,15 +4864,7 @@ fi
>
> test -z "${with_target_subdir}" && with_target_subdir=.
>
> -if test "${srcdir}" = "."; then
> - if test "${with_target_subdir}" != "."; then
> - newlib_basedir="${srcdir}/${with_multisrctop}../."
> - else
> - newlib_basedir="${srcdir}/${with_multisrctop}."
> - fi
> -else
> - newlib_basedir="${srcdir}/."
> -fi
> +newlib_basedir="${srcdir}/."
>
>
> abs_newlib_basedir=`cd "${newlib_basedir}" && pwd`
> @@ -8732,7 +8716,6 @@ srcdir="$srcdir"
> host="$host"
> target="$target"
> with_multisubdir="$with_multisubdir"
> -with_multisrctop="$with_multisrctop"
> with_target_subdir="$with_target_subdir"
> ac_configure_args="${multilib_arg} ${ac_configure_args}"
> multi_basedir="$multi_basedir"
> diff --git a/src-release b/src-release
> index b28597c09..878510b28 100644
> --- a/src-release
> +++ b/src-release
> @@ -46,7 +46,7 @@ PWD = $${PWDCMD-pwd}
> # Files in devo used in any net release.
> DEVO_SUPPORT= README Makefile.in configure configure.ac \
> config.guess config.sub config move-if-change \
> - COPYING COPYING.LIB install-sh config-ml.in symlink-tree \
> + COPYING COPYING.LIB install-sh config-ml.in \
> mkinstalldirs ltmain.sh missing ylwrap \
> libtool.m4 ltsugar.m4 ltversion.m4 ltoptions.m4 \
> Makefile.def Makefile.tpl src-release config.rpath \
> diff --git a/symlink-tree b/symlink-tree
> deleted file mode 100755
> index a9d50831b..000000000
> --- a/symlink-tree
> +++ /dev/null
> @@ -1,78 +0,0 @@
> -#!/bin/sh
> -# Create a symlink tree.
> -#
> -# Copyright (C) 1995, 2000, 2003 Free Software Foundation, Inc.
> -#
> -# This file 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, write to the Free Software
> -# Foundation, Inc., 51 Franklin Street, Fifth Floor,
> -# Boston, MA 02110-1301, USA.
> -#
> -# As a special exception to the GNU General Public License, if you
> -# distribute this file as part of a program that contains a
> -# configuration script generated by Autoconf, you may include it under
> -# the same distribution terms that you use for the rest of that program.
> -#
> -# Please report bugs to <gcc-bugs@gnu.org>
> -# and send patches to <gcc-patches@gnu.org>.
> -
> -# Syntax: symlink-tree srcdir "ignore1 ignore2 ..."
> -#
> -# where srcdir is the directory to create a symlink tree to,
> -# and "ignoreN" is a list of files/directories to ignore.
> -
> -prog=$0
> -srcdir=$1
> -ignore="$2"
> -
> -if test $# -lt 1; then
> - echo "symlink-tree error: Usage: symlink-tree srcdir \"ignore1 ignore2 ...\""
> - exit 1
> -fi
> -
> -ignore_additional=". .. CVS"
> -
> -# If we were invoked with a relative path name, adjust ${prog} to work
> -# in subdirs.
> -case ${prog} in
> -/* | [A-Za-z]:[\\/]*) ;;
> -*) prog=../${prog} ;;
> -esac
> -
> -# Set newsrcdir to something subdirectories can use.
> -case ${srcdir} in
> -/* | [A-Za-z]:[\\/]*) newsrcdir=${srcdir} ;;
> -*) newsrcdir=../${srcdir} ;;
> -esac
> -
> -for f in `ls -a ${srcdir}`; do
> - if [ -d ${srcdir}/$f ]; then
> - found=
> - for i in ${ignore} ${ignore_additional}; do
> - if [ "$f" = "$i" ]; then
> - found=yes
> - fi
> - done
> - if [ -z "${found}" ]; then
> - echo "$f ..working in"
> - if [ -d $f ]; then true; else mkdir $f; fi
> - (cd $f; ${prog} ${newsrcdir}/$f "${ignore}")
> - fi
> - else
> - echo "$f ..linked"
> - rm -f $f
> - ln -s ${srcdir}/$f .
> - fi
> -done
> -
> -exit 0
> --
> 2.49.0
>
>
According to your comment below, you don't have it working for multilib
newlib.
Regarding a test - you can try and build aarch64-none-elf. That will build
a default newlib and one in an ilp32 multilib directory.
-- Jeff J.
On Thu, Aug 21, 2025 at 2:29 PM John Ericson <git@johnericson.me> wrote:
> Any further feedback on this? Should I just go ahead and remake the patch
> to GCC likewise, too?
>
> John
>
> On Wed, Aug 13, 2025, at 4:07 PM, John Ericson wrote:
>
> See the new comment in `config-ml.in`, and the email chain starting with
> [1].
>
> The short story is that I am trying to do a bunch of build system
> improvements to GCC to make it easier to build GCC's runtime libraries
> separately (see [1] for why). As part of this, I started looking at the
> current multilib implementation, with a hunch that things could be
> simpler, and with those simplifications, we could refine the idiomatic
> division of labor between the outer and inner build systems in a way
> that I think would be just better, and also would make the separate or
> "per component" builds I want to do more maintainable.
>
> In that linked thread I found variable/mechanism that looked unused, and
> after some back and forth with Joseph Myers, we came to an agreement
> that since GNU Make was mandatory now, and thus VPATH support was
> assumed, there was no need to do these convoluted symlink tree things to
> unnaturally allow multilib to get away with `srcdir = objdir` building.
> (When indeed, `srcdir != objdir_for_machine1 != objdir_for_machine2` is
> multilib in a nutshell.)
>
> The last (as of this patch) email in the chain is Joseph writing:
>
> > I think it's reasonable to eliminate such a workaround, but I don't know
> > how the newlib community feels, should they wish to update the shared
> > toplevel build infrastructure with changes from GCC.
>
> This email is thus me submitting the multilib version of this change
> first, to ask you all that question.
>
> If our reasoning looks correct, and you see no reason to support these
> no-VPATH workarounds either, then we have our concensus! I think we can
> land this change in both repos (GCC, newlib-cygwin), in either order (no
> repo need wait on the other repo).
>
> N.B. I am not exactly sure how to test this. I have tested that it
> doesn't break the a non-multilib build of newlib. But when I try to do a
> multilib build in this repo with the toplevel makefile, it doesn't want
> build anything.
>
> config/ChangeLog:
>
> * multi.m4: Simplify, no more srcdir = . special case needed.
>
> ChangeLog:
>
> * newlib/acinclude.m4: Simplify, no more srcdir = . special case needed.
> * symlink-tree: Removed. It is no longer needed by anything.
> * MAINTAINERS: Remove symlink-tree entry.
> * etc/update-copyright.py: Remove symlink-tree entry.
> * src-release: Remove symlink-tree entry.
> * config-ml.in: Simplify a bunch, and reword docs to explain
> status quo: It's simpler than past, but can't yet forget about past
> until tech debt is gone.
> * libgloss/configure: Regenerate.
> * newlib/configure: Regenerate.
>
> [1]: https://sourceware.org/pipermail/gcc-patches/2025-August/691963.html
> [2]: https://blog.obsidian.systems/compiler-bootstrapping-in-nixpkgs/
> [3]: https://sourceware.org/pipermail/gcc-patches/2025-August/692233.html
>
> Signed-off-by: John Ericson <git@JohnEricson.me>
> ---
> MAINTAINERS | 4 --
> config-ml.in | 110 ++++++++++++----------------------------
> config/multi.m4 | 13 +----
> etc/update-copyright.py | 1 -
> libgloss/Makefile.in | 1 -
> libgloss/configure | 13 +----
> multilib.am | 1 -
> newlib/Makefile.in | 1 -
> newlib/acinclude.m4 | 12 +----
> newlib/configure | 23 ++-------
> src-release | 2 +-
> symlink-tree | 78 ----------------------------
> 12 files changed, 42 insertions(+), 217 deletions(-)
> delete mode 100755 symlink-tree
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index dd8601b4f..a479ea3d9 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -73,10 +73,6 @@ ltconfig; ltmain.sh; ltcf-*.sh
> move-if-change
> Send bug reports and patches to bug-gnulib@gnu.org.
>
> -symlink-tree
> - gcc: http://gcc.gnu.org
> - See libiberty.
> -
> newlib/; libgloss/
> http://sourceware.org/newlib/
> Patches to newlib@sourceware.org.
> diff --git a/config-ml.in b/config-ml.in
> index 5e519942b..56b6abae2 100644
> --- a/config-ml.in
> +++ b/config-ml.in
> @@ -30,28 +30,19 @@
> # It is advisable to support a few --enable/--disable options to let the
> # user select which libraries s/he really wants.
> #
> -# Subdirectories wishing to use multilib should put the following lines
> +# Subdirectories wishing to use multilib should put the following line
> # in the "post-target" section of configure.ac.
> #
> -# if [ "${srcdir}" = "." ] ; then
> -# if [ "${with_target_subdir}" != "." ] ; then
> -# . ${with_multisrctop}../../config-ml.in
> -# else
> -# . ${with_multisrctop}../config-ml.in
> -# fi
> -# else
> -# . ${srcdir}/../config-ml.in
> -# fi
> -#
> +# . ${srcdir}/../config-ml.in
> #
> # Things are complicated because 6 separate cases must be handled:
> # 2 (native, cross) x 3 (absolute-path, relative-not-dot, dot) = 6.
> #
> -# srcdir=. is special. It must handle make programs that don't handle
> VPATH.
> -# To implement this, a symlink tree is built for each library and for each
> -# multilib subdir.
> +# srcdir=. was formerly special. We used to want to handle make
> +# programs that don't handle VPATH. To implement this, a symlink tree
> +# was built for each library and for each multilib subdir.
> #
> -# The build tree is layed out as
> +# The build tree was laid out as
> #
> # ./
> # newlib
> @@ -60,6 +51,24 @@
> # m68881/
> # newlib
> #
> +# In such a symlink tree, the source code *files* of newlib were linked
> +# into each location, but the "newlib" directories themselves were
> +# actual separate directories, to hold different different build
> +# artifacts in each case. Accordingly ${srcdir}/.. would not work as
> +# intended, because instead of pointing to the top-level source
> +# directory, it would point to one of the parent build directories (e.g.
> +# "m68881" or "m68020") in the example above.
> +#
> +# Now, however, GNU Make is required, and GNU Make always supports
> +# VPATH. We therefore dropped support for these symlink trees. And
> +# accordingly, we can know that ${srcdir}/.. always does what we expect
> +# in all supported configurations.
> +#
> +# This will open the door to many many further simplifications of the
> +# multilib infrastructure. These simplifications are not yet
> +# implemented, however. Until they are, and the dead code removed, this
> +# historical information should stay in this file.
> +#
> # The nice feature about this arrangement is that inter-library references
> # in the build tree work without having to care where you are. Note that
> # inter-library references also work in the source tree because symlink
> trees
> @@ -72,14 +81,9 @@
> # Configure variables:
> # ${with_target_subdir} = "." for native, or ${target_alias} for cross.
> # Set by top level Makefile.
> -# ${with_multisrctop} = how many levels of multilibs there are in the
> source
> -# tree. It exists to handle the case of configuring in the source tree:
> -# ${srcdir} is not constant.
> # ${with_multisubdir} = name of multilib subdirectory (eg: m68020/m68881).
> #
> # Makefile variables:
> -# MULTISRCTOP = number of multilib levels in source tree (+1 if cross)
> -# (FIXME: note that this is different than ${with_multisrctop}. Check
> out.).
> # MULTIBUILDTOP = number of multilib levels in build tree
> # MULTIDIRS = list of multilib subdirs (eg: m68000 m68020 ...)
> # (only defined in each library's main Makefile).
> @@ -101,7 +105,6 @@
>
> Makefile=${ac_file-Makefile}
> ml_config_shell=${CONFIG_SHELL-/bin/sh}
> -ml_realsrcdir=${srcdir}
>
> # Scan all the arguments and set all the ones we need.
>
> @@ -188,23 +191,8 @@ if [ "${enable_multilib}" = yes ]; then
> # into one file, but it does leave us with having to perform this test.
> ml_toplevel_p=no
> if [ -z "${with_multisubdir}" ]; then
> - if [ "${srcdir}" = "." ]; then
> - # Use ${ml_realsrcdir} instead of ${srcdir} here to account for
> ${subdir}.
> - # ${with_target_subdir} = "." for native, otherwise target alias.
> - if [ "${with_target_subdir}" = "." ]; then
> - if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
> - ml_toplevel_p=yes
> - fi
> - else
> - if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then
> - ml_toplevel_p=yes
> - fi
> - fi
> - else
> - # Use ${ml_realsrcdir} instead of ${srcdir} here to account for
> ${subdir}.
> - if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
> - ml_toplevel_p=yes
> - fi
> + if [ -f ${srcdir}/../config-ml.in ]; then
> + ml_toplevel_p=yes
> fi
> fi
>
> @@ -565,36 +553,20 @@ mv Makefile.tem ${Makefile}
> fi # ${ml_toplevel_p} = yes
>
> if [ "${ml_verbose}" = --verbose ]; then
> - echo "Adding multilib support to ${Makefile} in ${ml_realsrcdir}"
> + echo "Adding multilib support to ${Makefile} in ${srcdir}"
> if [ "${ml_toplevel_p}" = yes ]; then
> echo "multidirs=${multidirs}"
> fi
> echo "with_multisubdir=${with_multisubdir}"
> fi
>
> -if [ "${srcdir}" = "." ]; then
> - if [ "${with_target_subdir}" != "." ]; then
> - ml_srcdotdot="../"
> - else
> - ml_srcdotdot=""
> - fi
> -else
> - ml_srcdotdot=""
> -fi
> -
> if [ -z "${with_multisubdir}" ]; then
> ml_subdir=
> ml_builddotdot=
> - : # ml_srcdotdot= # already set
> else
> ml_subdir="/${with_multisubdir}"
> # The '[^/][^/]*' appears that way to work around a SunOS sed bug.
> ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/
> - if [ "$srcdir" = "." ]; then
> - ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot}
> - else
> - : # ml_srcdotdot= # already set
> - fi
> fi
>
> if [ "${ml_toplevel_p}" = yes ]; then
> @@ -606,8 +578,8 @@ else
> fi
>
> # TOP is used by newlib and should not be used elsewhere for this purpose.
> -# MULTI{SRC,BUILD}TOP are the proper ones to use. MULTISRCTOP is empty
> -# when srcdir != builddir. MULTIBUILDTOP is always some number of ../'s.
> +# MULTIBUILDTOP are the proper ones to use.
> +# MULTIBUILDTOP is always some number of ../'s.
> # FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can
> # delete TOP. Newlib may wish to continue to use TOP for its own purposes
> # of course.
> @@ -628,7 +600,6 @@ fi
> # options).
>
> sed -e "s:^TOP[ ]*=[ ]*\([./]*\)[ ]*$:TOP = ${ml_builddotdot}\1:" \
> - -e "s:^MULTISRCTOP[ ]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \
> -e "s:^MULTIBUILDTOP[ ]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \
> -e "s:^MULTIDIRS[ ]*=.*$:MULTIDIRS = ${multidirs}:" \
> -e "s:^MULTISUBDIR[ ]*=.*$:MULTISUBDIR = ${ml_subdir}:" \
> @@ -692,24 +663,8 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}"
> ]; then
>
> case ${srcdir} in
> ".")
> - echo "Building symlink tree in
> `${PWDCMD-pwd}`/${ml_dir}/${ml_libdir}"
> - if [ "${with_target_subdir}" != "." ]; then
> - ml_unsubdir="../"
> - else
> - ml_unsubdir=""
> - fi
> - (cd ${ml_dir}/${ml_libdir};
> - ../${dotdot}${ml_unsubdir}symlink-tree
> ../${dotdot}${ml_unsubdir}${ml_libdir} "")
> - if [ -f ${ml_dir}/${ml_libdir}/${Makefile} ]; then
> - if [ x"${MAKE}" = x ]; then
> - (cd ${ml_dir}/${ml_libdir}; make distclean)
> - else
> - (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean)
> - fi
> - fi
> - ml_newsrcdir="."
> - ml_srcdiroption=
> - multisrctop=${dotdot}
> + echo "Multilib builds with srcdir = objdir are no longer supported.
> Please use a separate objdir."
> + exit 1
> ;;
> *)
> case "${srcdir}" in
> @@ -721,7 +676,6 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}"
> ]; then
> ;;
> esac
> ml_srcdiroption="-srcdir=${ml_newsrcdir}"
> - multisrctop=
> ;;
> esac
>
> @@ -867,7 +821,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}"
> ]; then
> fi
>
> if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
> - --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
> + --with-multisubdir=${ml_dir} \
> "${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
> true
> else
> diff --git a/config/multi.m4 b/config/multi.m4
> index 5b62ecc0a..5f033284f 100644
> --- a/config/multi.m4
> +++ b/config/multi.m4
> @@ -23,18 +23,10 @@ AC_ARG_ENABLE(multilib,
> [multilib=yes])
>
> # We may get other options which we leave undocumented:
> -# --with-target-subdir, --with-multisrctop, --with-multisubdir
> +# --with-target-subdir, --with-multisubdir
> # See config-ml.in if you want the gory details.
>
> -if test "$srcdir" = "."; then
> - if test "$with_target_subdir" != "."; then
> - multi_basedir="$srcdir/$with_multisrctop../$2"
> - else
> - multi_basedir="$srcdir/$with_multisrctop$2"
> - fi
> -else
> - multi_basedir="$srcdir/$2"
> -fi
> +multi_basedir="$srcdir/$2"
> AC_SUBST(multi_basedir)
>
> # Even if the default multilib is not a cross compilation,
> @@ -57,7 +49,6 @@ srcdir="$srcdir"
> host="$host"
> target="$target"
> with_multisubdir="$with_multisubdir"
> -with_multisrctop="$with_multisrctop"
> with_target_subdir="$with_target_subdir"
> ac_configure_args="${multilib_arg} ${ac_configure_args}"
> multi_basedir="$multi_basedir"
> diff --git a/etc/update-copyright.py b/etc/update-copyright.py
> index 7f605d058..df7c83671 100755
> --- a/etc/update-copyright.py
> +++ b/etc/update-copyright.py
> @@ -96,7 +96,6 @@ class GenericFilter:
> 'mkinstalldirs',
> 'move-if-change',
> 'shlibpath.m4',
> - 'symlink-tree',
> 'ylwrap',
>
> # Skip FSF mission statement, etc.
> diff --git a/libgloss/Makefile.in b/libgloss/Makefile.in
> index 5146a7880..212d74ed8 100644
> --- a/libgloss/Makefile.in
> +++ b/libgloss/Makefile.in
> @@ -2139,7 +2139,6 @@ FLAGS_TO_PASS = \
> "INSTALL_DATA=$(INSTALL_DATA)" \
> "DESTDIR=$(DESTDIR)"
>
> -MULTISRCTOP =
> MULTIBUILDTOP =
> MULTIDIRS =
> MULTISUBDIR =
> diff --git a/libgloss/configure b/libgloss/configure
> index ba071824b..1c47f72ea 100755
> --- a/libgloss/configure
> +++ b/libgloss/configure
> @@ -5652,18 +5652,10 @@ fi
>
>
> # We may get other options which we leave undocumented:
> -# --with-target-subdir, --with-multisrctop, --with-multisubdir
> +# --with-target-subdir, --with-multisubdir
> # See config-ml.in if you want the gory details.
>
> -if test "$srcdir" = "."; then
> - if test "$with_target_subdir" != "."; then
> - multi_basedir="$srcdir/$with_multisrctop../.."
> - else
> - multi_basedir="$srcdir/$with_multisrctop.."
> - fi
> -else
> - multi_basedir="$srcdir/.."
> -fi
> +multi_basedir="$srcdir/.."
>
>
> # Even if the default multilib is not a cross compilation,
> @@ -6616,7 +6608,6 @@ srcdir="$srcdir"
> host="$host"
> target="$target"
> with_multisubdir="$with_multisubdir"
> -with_multisrctop="$with_multisrctop"
> with_target_subdir="$with_target_subdir"
> ac_configure_args="${multilib_arg} ${ac_configure_args}"
> multi_basedir="$multi_basedir"
> diff --git a/multilib.am b/multilib.am
> index 5c98b69bd..0c4e3283e 100644
> --- a/multilib.am
> +++ b/multilib.am
> @@ -10,7 +10,6 @@
> ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> ## GNU General Public License for more details.
>
> -MULTISRCTOP =
> MULTIBUILDTOP =
> MULTIDIRS =
> MULTISUBDIR =
> diff --git a/newlib/Makefile.in b/newlib/Makefile.in
> index c5492c6b6..c16ab2626 100644
> --- a/newlib/Makefile.in
> +++ b/newlib/Makefile.in
> @@ -4305,7 +4305,6 @@ TARG_INCLUDE_CP_DIR = \
> if (cd $$srcdir 2>/dev/null && [ "`echo *.h`" != "*.h" ]); then cp
> $$srcdir/*.h $$dstdir/; fi
>
> CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
> -MULTISRCTOP =
> MULTIBUILDTOP =
> MULTIDIRS =
> MULTISUBDIR =
> diff --git a/newlib/acinclude.m4 b/newlib/acinclude.m4
> index 19301289f..3ba0fa01f 100644
> --- a/newlib/acinclude.m4
> +++ b/newlib/acinclude.m4
> @@ -94,19 +94,11 @@ AC_ARG_ENABLE(newlib-fno-builtin,
>
>
> dnl We may get other options which we don't document:
> -dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
> +dnl --with-target-subdir, --with-multisubdir
>
> test -z "[$]{with_target_subdir}" && with_target_subdir=.
>
> -if test "[$]{srcdir}" = "."; then
> - if test "[$]{with_target_subdir}" != "."; then
> - newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
> - else
> - newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
> - fi
> -else
> - newlib_basedir="[$]{srcdir}/$1"
> -fi
> +newlib_basedir="[$]{srcdir}/$1"
> AC_SUBST(newlib_basedir)
>
> abs_newlib_basedir=`cd "${newlib_basedir}" && pwd`
> diff --git a/newlib/configure b/newlib/configure
> index 33a2ed1c5..3219f0366 100755
> --- a/newlib/configure
> +++ b/newlib/configure
> @@ -2648,18 +2648,10 @@ fi
>
>
> # We may get other options which we leave undocumented:
> -# --with-target-subdir, --with-multisrctop, --with-multisubdir
> +# --with-target-subdir, --with-multisubdir
> # See config-ml.in if you want the gory details.
>
> -if test "$srcdir" = "."; then
> - if test "$with_target_subdir" != "."; then
> - multi_basedir="$srcdir/$with_multisrctop../.."
> - else
> - multi_basedir="$srcdir/$with_multisrctop.."
> - fi
> -else
> - multi_basedir="$srcdir/.."
> -fi
> +multi_basedir="$srcdir/.."
>
>
> # Even if the default multilib is not a cross compilation,
> @@ -4872,15 +4864,7 @@ fi
>
> test -z "${with_target_subdir}" && with_target_subdir=.
>
> -if test "${srcdir}" = "."; then
> - if test "${with_target_subdir}" != "."; then
> - newlib_basedir="${srcdir}/${with_multisrctop}../."
> - else
> - newlib_basedir="${srcdir}/${with_multisrctop}."
> - fi
> -else
> - newlib_basedir="${srcdir}/."
> -fi
> +newlib_basedir="${srcdir}/."
>
>
> abs_newlib_basedir=`cd "${newlib_basedir}" && pwd`
> @@ -8732,7 +8716,6 @@ srcdir="$srcdir"
> host="$host"
> target="$target"
> with_multisubdir="$with_multisubdir"
> -with_multisrctop="$with_multisrctop"
> with_target_subdir="$with_target_subdir"
> ac_configure_args="${multilib_arg} ${ac_configure_args}"
> multi_basedir="$multi_basedir"
> diff --git a/src-release b/src-release
> index b28597c09..878510b28 100644
> --- a/src-release
> +++ b/src-release
> @@ -46,7 +46,7 @@ PWD = $${PWDCMD-pwd}
> # Files in devo used in any net release.
> DEVO_SUPPORT= README Makefile.in configure configure.ac \
> config.guess config.sub config move-if-change \
> - COPYING COPYING.LIB install-sh config-ml.in symlink-tree \
> + COPYING COPYING.LIB install-sh config-ml.in \
> mkinstalldirs ltmain.sh missing ylwrap \
> libtool.m4 ltsugar.m4 ltversion.m4 ltoptions.m4 \
> Makefile.def Makefile.tpl src-release config.rpath \
> diff --git a/symlink-tree b/symlink-tree
> deleted file mode 100755
> index a9d50831b..000000000
> --- a/symlink-tree
> +++ /dev/null
> @@ -1,78 +0,0 @@
> -#!/bin/sh
> -# Create a symlink tree.
> -#
> -# Copyright (C) 1995, 2000, 2003 Free Software Foundation, Inc.
> -#
> -# This file 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, write to the Free Software
> -# Foundation, Inc., 51 Franklin Street, Fifth Floor,
> -# Boston, MA 02110-1301, USA.
> -#
> -# As a special exception to the GNU General Public License, if you
> -# distribute this file as part of a program that contains a
> -# configuration script generated by Autoconf, you may include it under
> -# the same distribution terms that you use for the rest of that program.
> -#
> -# Please report bugs to <gcc-bugs@gnu.org>
> -# and send patches to <gcc-patches@gnu.org>.
> -
> -# Syntax: symlink-tree srcdir "ignore1 ignore2 ..."
> -#
> -# where srcdir is the directory to create a symlink tree to,
> -# and "ignoreN" is a list of files/directories to ignore.
> -
> -prog=$0
> -srcdir=$1
> -ignore="$2"
> -
> -if test $# -lt 1; then
> - echo "symlink-tree error: Usage: symlink-tree srcdir \"ignore1 ignore2
> ...\""
> - exit 1
> -fi
> -
> -ignore_additional=". .. CVS"
> -
> -# If we were invoked with a relative path name, adjust ${prog} to work
> -# in subdirs.
> -case ${prog} in
> -/* | [A-Za-z]:[\\/]*) ;;
> -*) prog=../${prog} ;;
> -esac
> -
> -# Set newsrcdir to something subdirectories can use.
> -case ${srcdir} in
> -/* | [A-Za-z]:[\\/]*) newsrcdir=${srcdir} ;;
> -*) newsrcdir=../${srcdir} ;;
> -esac
> -
> -for f in `ls -a ${srcdir}`; do
> - if [ -d ${srcdir}/$f ]; then
> - found=
> - for i in ${ignore} ${ignore_additional}; do
> - if [ "$f" = "$i" ]; then
> - found=yes
> - fi
> - done
> - if [ -z "${found}" ]; then
> - echo "$f ..working in"
> - if [ -d $f ]; then true; else mkdir $f; fi
> - (cd $f; ${prog} ${newsrcdir}/$f "${ignore}")
> - fi
> - else
> - echo "$f ..linked"
> - rm -f $f
> - ln -s ${srcdir}/$f .
> - fi
> -done
> -
> -exit 0
> --
> 2.49.0
>
>
>
>
Check that nothing breaks Mike Frysinger's flattened make structure?
On 2025-08-21 14:26, Jeff Johnston wrote:
> According to your comment below, you don't have it working for multilib newlib.
>
> Regarding a test - you can try and build aarch64-none-elf. That will build a
> default newlib and one in an ilp32 multilib directory.
>
> -- Jeff J.
>
> On Thu, Aug 21, 2025 at 2:29 PM John Ericson wrote:
> Any further feedback on this? Should I just go ahead and remake the patch to
> GCC likewise, too?
>
> John
>
> On Wed, Aug 13, 2025, at 4:07 PM, John Ericson wrote:
>> See the new comment in `config-ml.in <http://config-ml.in>`, and the email
>> chain starting with
>> [1].
>>
>> The short story is that I am trying to do a bunch of build system
>> improvements to GCC to make it easier to build GCC's runtime libraries
>> separately (see [1] for why). As part of this, I started looking at the
>> current multilib implementation, with a hunch that things could be
>> simpler, and with those simplifications, we could refine the idiomatic
>> division of labor between the outer and inner build systems in a way
>> that I think would be just better, and also would make the separate or
>> "per component" builds I want to do more maintainable.
>>
>> In that linked thread I found variable/mechanism that looked unused, and
>> after some back and forth with Joseph Myers, we came to an agreement
>> that since GNU Make was mandatory now, and thus VPATH support was
>> assumed, there was no need to do these convoluted symlink tree things to
>> unnaturally allow multilib to get away with `srcdir = objdir` building.
>> (When indeed, `srcdir != objdir_for_machine1 != objdir_for_machine2` is
>> multilib in a nutshell.)
>>
>> The last (as of this patch) email in the chain is Joseph writing:
>>
>> > I think it's reasonable to eliminate such a workaround, but I don't know
>> > how the newlib community feels, should they wish to update the shared
>> > toplevel build infrastructure with changes from GCC.
>>
>> This email is thus me submitting the multilib version of this change
>> first, to ask you all that question.
>>
>> If our reasoning looks correct, and you see no reason to support these
>> no-VPATH workarounds either, then we have our concensus! I think we can
>> land this change in both repos (GCC, newlib-cygwin), in either order (no
>> repo need wait on the other repo).
>>
>> N.B. I am not exactly sure how to test this. I have tested that it
>> doesn't break the a non-multilib build of newlib. But when I try to do a
>> multilib build in this repo with the toplevel makefile, it doesn't want
>> build anything.
>>
>> config/ChangeLog:
>>
>> * multi.m4: Simplify, no more srcdir = . special case needed.
>>
>> ChangeLog:
>>
>> * newlib/acinclude.m4: Simplify, no more srcdir = . special case needed.
>> * symlink-tree: Removed. It is no longer needed by anything.
>> * MAINTAINERS: Remove symlink-tree entry.
>> * etc/update-copyright.py: Remove symlink-tree entry.
>> * src-release: Remove symlink-tree entry.
>> * config-ml.in <http://config-ml.in>: Simplify a bunch, and reword docs to
>> explain
>> status quo: It's simpler than past, but can't yet forget about past
>> until tech debt is gone.
>> * libgloss/configure: Regenerate.
>> * newlib/configure: Regenerate.
>>
>> [1]: https://sourceware.org/pipermail/gcc-patches/2025-August/691963.html
>> <https://sourceware.org/pipermail/gcc-patches/2025-August/691963.html>
>> [2]: https://blog.obsidian.systems/compiler-bootstrapping-in-nixpkgs/
>> <https://blog.obsidian.systems/compiler-bootstrapping-in-nixpkgs/>
>> [3]: https://sourceware.org/pipermail/gcc-patches/2025-August/692233.html
>> <https://sourceware.org/pipermail/gcc-patches/2025-August/692233.html>
>>
>> Signed-off-by: John Ericson
>> ---
>> MAINTAINERS | 4 --
>> config-ml.in <http://config-ml.in> | 110 +++++++++++
>> +----------------------------
>> config/multi.m4 | 13 +----
>> etc/update-copyright.py | 1 -
>> libgloss/Makefile.in | 1 -
>> libgloss/configure | 13 +----
>> multilib.am <http://multilib.am> | 1 -
>> newlib/Makefile.in | 1 -
>> newlib/acinclude.m4 | 12 +----
>> newlib/configure | 23 ++-------
>> src-release | 2 +-
>> symlink-tree | 78 ----------------------------
>> 12 files changed, 42 insertions(+), 217 deletions(-)
>> delete mode 100755 symlink-tree
Thanks, both of you, for taking a look
On 2025-08-21 14:26, Jeff Johnston wrote:
> According to your comment below, you don't have it working for multilib newlib.
Just to be clear, I couldn't before get a --with-multilib build going with or without my patch. So I didn't know whether it worked, *not* knew that I had broken something.
> Regarding a test - you can try and build aarch64-none-elf. That will build a
> default newlib and one in an ilp32 multilib directory.
OK so short story, thanks, that worked! The patch is working
The full story is my distro (Nixpkgs) 's aarch64-none-elf GCC was built with `--disable-multilib`, so I faked it a bit with more or less:
diff --git a/config-ml.in b/config-ml.in
index 56b6abae2..578377785 100644
--- a/config-ml.in
+++ b/config-ml.in
@@ -103,6 +103,8 @@
# Note that `host' in this case is GCC's `target'. Target libraries are
# configured for a particular host.
+print_multilib=`printf '.;\nfoo;@mabi=ilp32'`
+
Makefile=${ac_file-Makefile}
ml_config_shell=${CONFIG_SHELL-/bin/sh}
@@ -203,7 +205,7 @@ fi
if [ "${ml_toplevel_p}" = yes ]; then
multidirs=
-for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
+for i in $print_multilib; do
dir=`echo $i | sed -e 's/;.*$//'`
if [ "${dir}" = "." ]; then
true
@@ -484,7 +486,7 @@ multi-do:
srcrootpre=`cd $(srcdir); ${PWD_COMMAND}`/; export srcrootpre; \
lib=`echo "$${rootpre}" | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \
compiler="$(CC)"; \
- for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \
+ for i in `printf '.;\nfoo;@mabi=ilp32'`; do \
dir=`echo $$i | sed -e 's/;.*$$//'`; \
if [ "$${dir}" = "." ]; then \
true; \
@@ -693,7 +695,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
fi
# find compiler flag corresponding to ${ml_dir}
- for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
+ for i in $print_multilib; do
dir=`echo $i | sed -e 's/;.*$//'`
if [ "${dir}" = "${ml_dir}" ]; then
flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`
and it worked!
$ make
[...]
Making all in .
make[8]: Entering directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
true DO=all multi-do # make
make[8]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
make[7]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
make[6]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
+ true
make[5]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
make[4]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
make[3]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
make[2]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
make[1]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build
$ echo $?
0
And grepping confirms the right things happened:
$ grep -irl ilp32 aarch64-none-elf | head
aarch64-none-elf/newlib/Makefile
aarch64-none-elf/newlib/config.log
aarch64-none-elf/newlib/targ-include/machine/_fpmath.h
aarch64-none-elf/newlib/config.status
aarch64-none-elf/foo/newlib/libc.a
aarch64-none-elf/foo/newlib/config.status
aarch64-none-elf/foo/newlib/config.cache
aarch64-none-elf/foo/newlib/config.log
aarch64-none-elf/foo/newlib/foo/libm.a
aarch64-none-elf/foo/newlib/foo/libc.a
$ grep -irl lp64 aarch64-none-elf | head
aarch64-none-elf/newlib/libc/libm_a-sf_isinf.o
aarch64-none-elf/newlib/libc/libm_a-s_isnand.o
aarch64-none-elf/newlib/libc/libm_a-s_isinfd.o
aarch64-none-elf/newlib/libc/locale/libc_a-nl_langinfo.o
aarch64-none-elf/newlib/libc/locale/libc_a-duplocale.o
aarch64-none-elf/newlib/libc/locale/libc_a-locale.o
aarch64-none-elf/newlib/libc/locale/libc_a-lmonetary.o
aarch64-none-elf/newlib/libc/locale/libc_a-timelocal.o
aarch64-none-elf/newlib/libc/locale/libc_a-freelocale.o
aarch64-none-elf/newlib/libc/locale/libc_a-localeconv.o
So I think we can now consider the patch tested! To the extent this is artificial, with me possibly missing the proper libgcc etc. from my --disable-multilib GCC, I don't think that matters with the patch I did.
On Fri, Aug 22, 2025, at 5:44 AM, Brian Inglis wrote:
> Check that nothing breaks Mike Frysinger's flattened make structure?
I wasn't sure what you mean by this?
$ git log --author 'Mike Frysinger' --grep=akefile
indicates it might be his making libgloss use Automake and less recursive make? I didn't find any special options to test, but I did build both libgloss and newlib
$ find aarch64-none-elf/ -maxdepth 2| grep libgloss | head -n2
aarch64-none-elf/foo/libgloss
aarch64-none-elf/libgloss
so I didn't break libgloss either.
Let me know if this is amount of testing good, or if there is any more information you need.
Thanks,
John
Hi, ping on this. Is it all good? I would appreciate being able to land these changes if possible.
Per the original, I *was* able to test it after all.
John
On Fri, Aug 22, 2025, at 10:01 PM, John Ericson wrote:
> Thanks, both of you, for taking a look
>
> On 2025-08-21 14:26, Jeff Johnston wrote:
>> According to your comment below, you don't have it working for multilib newlib.
>
> Just to be clear, I couldn't before get a --with-multilib build going with or without my patch. So I didn't know whether it worked, *not* knew that I had broken something.
>
>> Regarding a test - you can try and build aarch64-none-elf. That will build a
>> default newlib and one in an ilp32 multilib directory.
>
> OK so short story, thanks, that worked! The patch is working
>
> The full story is my distro (Nixpkgs) 's aarch64-none-elf GCC was built with `--disable-multilib`, so I faked it a bit with more or less:
>
> diff --git a/config-ml.in b/config-ml.in
> index 56b6abae2..578377785 100644
> --- a/config-ml.in
> +++ b/config-ml.in
> @@ -103,6 +103,8 @@
> # Note that `host' in this case is GCC's `target'. Target libraries are
> # configured for a particular host.
>
> +print_multilib=`printf '.;\nfoo;@mabi=ilp32'`
> +
> Makefile=${ac_file-Makefile}
> ml_config_shell=${CONFIG_SHELL-/bin/sh}
>
> @@ -203,7 +205,7 @@ fi
> if [ "${ml_toplevel_p}" = yes ]; then
>
> multidirs=
> -for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
> +for i in $print_multilib; do
> dir=`echo $i | sed -e 's/;.*$//'`
> if [ "${dir}" = "." ]; then
> true
> @@ -484,7 +486,7 @@ multi-do:
> srcrootpre=`cd $(srcdir); ${PWD_COMMAND}`/; export srcrootpre; \
> lib=`echo "$${rootpre}" | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \
> compiler="$(CC)"; \
> - for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \
> + for i in `printf '.;\nfoo;@mabi=ilp32'`; do \
> dir=`echo $$i | sed -e 's/;.*$$//'`; \
> if [ "$${dir}" = "." ]; then \
> true; \
> @@ -693,7 +695,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
> fi
>
> # find compiler flag corresponding to ${ml_dir}
> - for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
> + for i in $print_multilib; do
> dir=`echo $i | sed -e 's/;.*$//'`
> if [ "${dir}" = "${ml_dir}" ]; then
> flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`
>
> and it worked!
>
> $ make
> [...]
> Making all in .
> make[8]: Entering directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
> true DO=all multi-do # make
> make[8]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
> make[7]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
> make[6]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/foo/libgloss'
> + true
> make[5]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
> make[4]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
> make[3]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
> make[2]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build/aarch64-none-elf/libgloss'
> make[1]: Leaving directory '/home/jcericson/src/gnu/newlib-cygwin/build
>
> $ echo $?
> 0
>
> And grepping confirms the right things happened:
>
> $ grep -irl ilp32 aarch64-none-elf | head
> aarch64-none-elf/newlib/Makefile
> aarch64-none-elf/newlib/config.log
> aarch64-none-elf/newlib/targ-include/machine/_fpmath.h
> aarch64-none-elf/newlib/config.status
> aarch64-none-elf/foo/newlib/libc.a
> aarch64-none-elf/foo/newlib/config.status
> aarch64-none-elf/foo/newlib/config.cache
> aarch64-none-elf/foo/newlib/config.log
> aarch64-none-elf/foo/newlib/foo/libm.a
> aarch64-none-elf/foo/newlib/foo/libc.a
>
> $ grep -irl lp64 aarch64-none-elf | head
> aarch64-none-elf/newlib/libc/libm_a-sf_isinf.o
> aarch64-none-elf/newlib/libc/libm_a-s_isnand.o
> aarch64-none-elf/newlib/libc/libm_a-s_isinfd.o
> aarch64-none-elf/newlib/libc/locale/libc_a-nl_langinfo.o
> aarch64-none-elf/newlib/libc/locale/libc_a-duplocale.o
> aarch64-none-elf/newlib/libc/locale/libc_a-locale.o
> aarch64-none-elf/newlib/libc/locale/libc_a-lmonetary.o
> aarch64-none-elf/newlib/libc/locale/libc_a-timelocal.o
> aarch64-none-elf/newlib/libc/locale/libc_a-freelocale.o
> aarch64-none-elf/newlib/libc/locale/libc_a-localeconv.o
>
> So I think we can now consider the patch tested! To the extent this is artificial, with me possibly missing the proper libgcc etc. from my --disable-multilib GCC, I don't think that matters with the patch I did.
>
> On Fri, Aug 22, 2025, at 5:44 AM, Brian Inglis wrote:
>> Check that nothing breaks Mike Frysinger's flattened make structure?
>
> I wasn't sure what you mean by this?
>
> $ git log --author 'Mike Frysinger' --grep=akefile
>
> indicates it might be his making libgloss use Automake and less recursive make? I didn't find any special options to test, but I did build both libgloss and newlib
>
> $ find aarch64-none-elf/ -maxdepth 2| grep libgloss | head -n2
> aarch64-none-elf/foo/libgloss
> aarch64-none-elf/libgloss
>
> so I didn't break libgloss either.
>
> Let me know if this is amount of testing good, or if there is any more information you need.
>
> Thanks,
>
> John
@@ -73,10 +73,6 @@ ltconfig; ltmain.sh; ltcf-*.sh
move-if-change
Send bug reports and patches to bug-gnulib@gnu.org.
-symlink-tree
- gcc: http://gcc.gnu.org
- See libiberty.
-
newlib/; libgloss/
http://sourceware.org/newlib/
Patches to newlib@sourceware.org.
@@ -30,28 +30,19 @@
# It is advisable to support a few --enable/--disable options to let the
# user select which libraries s/he really wants.
#
-# Subdirectories wishing to use multilib should put the following lines
+# Subdirectories wishing to use multilib should put the following line
# in the "post-target" section of configure.ac.
#
-# if [ "${srcdir}" = "." ] ; then
-# if [ "${with_target_subdir}" != "." ] ; then
-# . ${with_multisrctop}../../config-ml.in
-# else
-# . ${with_multisrctop}../config-ml.in
-# fi
-# else
-# . ${srcdir}/../config-ml.in
-# fi
-#
+# . ${srcdir}/../config-ml.in
#
# Things are complicated because 6 separate cases must be handled:
# 2 (native, cross) x 3 (absolute-path, relative-not-dot, dot) = 6.
#
-# srcdir=. is special. It must handle make programs that don't handle VPATH.
-# To implement this, a symlink tree is built for each library and for each
-# multilib subdir.
+# srcdir=. was formerly special. We used to want to handle make
+# programs that don't handle VPATH. To implement this, a symlink tree
+# was built for each library and for each multilib subdir.
#
-# The build tree is layed out as
+# The build tree was laid out as
#
# ./
# newlib
@@ -60,6 +51,24 @@
# m68881/
# newlib
#
+# In such a symlink tree, the source code *files* of newlib were linked
+# into each location, but the "newlib" directories themselves were
+# actual separate directories, to hold different different build
+# artifacts in each case. Accordingly ${srcdir}/.. would not work as
+# intended, because instead of pointing to the top-level source
+# directory, it would point to one of the parent build directories (e.g.
+# "m68881" or "m68020") in the example above.
+#
+# Now, however, GNU Make is required, and GNU Make always supports
+# VPATH. We therefore dropped support for these symlink trees. And
+# accordingly, we can know that ${srcdir}/.. always does what we expect
+# in all supported configurations.
+#
+# This will open the door to many many further simplifications of the
+# multilib infrastructure. These simplifications are not yet
+# implemented, however. Until they are, and the dead code removed, this
+# historical information should stay in this file.
+#
# The nice feature about this arrangement is that inter-library references
# in the build tree work without having to care where you are. Note that
# inter-library references also work in the source tree because symlink trees
@@ -72,14 +81,9 @@
# Configure variables:
# ${with_target_subdir} = "." for native, or ${target_alias} for cross.
# Set by top level Makefile.
-# ${with_multisrctop} = how many levels of multilibs there are in the source
-# tree. It exists to handle the case of configuring in the source tree:
-# ${srcdir} is not constant.
# ${with_multisubdir} = name of multilib subdirectory (eg: m68020/m68881).
#
# Makefile variables:
-# MULTISRCTOP = number of multilib levels in source tree (+1 if cross)
-# (FIXME: note that this is different than ${with_multisrctop}. Check out.).
# MULTIBUILDTOP = number of multilib levels in build tree
# MULTIDIRS = list of multilib subdirs (eg: m68000 m68020 ...)
# (only defined in each library's main Makefile).
@@ -101,7 +105,6 @@
Makefile=${ac_file-Makefile}
ml_config_shell=${CONFIG_SHELL-/bin/sh}
-ml_realsrcdir=${srcdir}
# Scan all the arguments and set all the ones we need.
@@ -188,23 +191,8 @@ if [ "${enable_multilib}" = yes ]; then
# into one file, but it does leave us with having to perform this test.
ml_toplevel_p=no
if [ -z "${with_multisubdir}" ]; then
- if [ "${srcdir}" = "." ]; then
- # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
- # ${with_target_subdir} = "." for native, otherwise target alias.
- if [ "${with_target_subdir}" = "." ]; then
- if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
- ml_toplevel_p=yes
- fi
- else
- if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then
- ml_toplevel_p=yes
- fi
- fi
- else
- # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
- if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
- ml_toplevel_p=yes
- fi
+ if [ -f ${srcdir}/../config-ml.in ]; then
+ ml_toplevel_p=yes
fi
fi
@@ -565,36 +553,20 @@ mv Makefile.tem ${Makefile}
fi # ${ml_toplevel_p} = yes
if [ "${ml_verbose}" = --verbose ]; then
- echo "Adding multilib support to ${Makefile} in ${ml_realsrcdir}"
+ echo "Adding multilib support to ${Makefile} in ${srcdir}"
if [ "${ml_toplevel_p}" = yes ]; then
echo "multidirs=${multidirs}"
fi
echo "with_multisubdir=${with_multisubdir}"
fi
-if [ "${srcdir}" = "." ]; then
- if [ "${with_target_subdir}" != "." ]; then
- ml_srcdotdot="../"
- else
- ml_srcdotdot=""
- fi
-else
- ml_srcdotdot=""
-fi
-
if [ -z "${with_multisubdir}" ]; then
ml_subdir=
ml_builddotdot=
- : # ml_srcdotdot= # already set
else
ml_subdir="/${with_multisubdir}"
# The '[^/][^/]*' appears that way to work around a SunOS sed bug.
ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/
- if [ "$srcdir" = "." ]; then
- ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot}
- else
- : # ml_srcdotdot= # already set
- fi
fi
if [ "${ml_toplevel_p}" = yes ]; then
@@ -606,8 +578,8 @@ else
fi
# TOP is used by newlib and should not be used elsewhere for this purpose.
-# MULTI{SRC,BUILD}TOP are the proper ones to use. MULTISRCTOP is empty
-# when srcdir != builddir. MULTIBUILDTOP is always some number of ../'s.
+# MULTIBUILDTOP are the proper ones to use.
+# MULTIBUILDTOP is always some number of ../'s.
# FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can
# delete TOP. Newlib may wish to continue to use TOP for its own purposes
# of course.
@@ -628,7 +600,6 @@ fi
# options).
sed -e "s:^TOP[ ]*=[ ]*\([./]*\)[ ]*$:TOP = ${ml_builddotdot}\1:" \
- -e "s:^MULTISRCTOP[ ]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \
-e "s:^MULTIBUILDTOP[ ]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \
-e "s:^MULTIDIRS[ ]*=.*$:MULTIDIRS = ${multidirs}:" \
-e "s:^MULTISUBDIR[ ]*=.*$:MULTISUBDIR = ${ml_subdir}:" \
@@ -692,24 +663,8 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
case ${srcdir} in
".")
- echo "Building symlink tree in `${PWDCMD-pwd}`/${ml_dir}/${ml_libdir}"
- if [ "${with_target_subdir}" != "." ]; then
- ml_unsubdir="../"
- else
- ml_unsubdir=""
- fi
- (cd ${ml_dir}/${ml_libdir};
- ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "")
- if [ -f ${ml_dir}/${ml_libdir}/${Makefile} ]; then
- if [ x"${MAKE}" = x ]; then
- (cd ${ml_dir}/${ml_libdir}; make distclean)
- else
- (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean)
- fi
- fi
- ml_newsrcdir="."
- ml_srcdiroption=
- multisrctop=${dotdot}
+ echo "Multilib builds with srcdir = objdir are no longer supported. Please use a separate objdir."
+ exit 1
;;
*)
case "${srcdir}" in
@@ -721,7 +676,6 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
;;
esac
ml_srcdiroption="-srcdir=${ml_newsrcdir}"
- multisrctop=
;;
esac
@@ -867,7 +821,7 @@ if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
fi
if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
- --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
+ --with-multisubdir=${ml_dir} \
"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
true
else
@@ -23,18 +23,10 @@ AC_ARG_ENABLE(multilib,
[multilib=yes])
# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
+# --with-target-subdir, --with-multisubdir
# See config-ml.in if you want the gory details.
-if test "$srcdir" = "."; then
- if test "$with_target_subdir" != "."; then
- multi_basedir="$srcdir/$with_multisrctop../$2"
- else
- multi_basedir="$srcdir/$with_multisrctop$2"
- fi
-else
- multi_basedir="$srcdir/$2"
-fi
+multi_basedir="$srcdir/$2"
AC_SUBST(multi_basedir)
# Even if the default multilib is not a cross compilation,
@@ -57,7 +49,6 @@ srcdir="$srcdir"
host="$host"
target="$target"
with_multisubdir="$with_multisubdir"
-with_multisrctop="$with_multisrctop"
with_target_subdir="$with_target_subdir"
ac_configure_args="${multilib_arg} ${ac_configure_args}"
multi_basedir="$multi_basedir"
@@ -96,7 +96,6 @@ class GenericFilter:
'mkinstalldirs',
'move-if-change',
'shlibpath.m4',
- 'symlink-tree',
'ylwrap',
# Skip FSF mission statement, etc.
@@ -2139,7 +2139,6 @@ FLAGS_TO_PASS = \
"INSTALL_DATA=$(INSTALL_DATA)" \
"DESTDIR=$(DESTDIR)"
-MULTISRCTOP =
MULTIBUILDTOP =
MULTIDIRS =
MULTISUBDIR =
@@ -5652,18 +5652,10 @@ fi
# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
+# --with-target-subdir, --with-multisubdir
# See config-ml.in if you want the gory details.
-if test "$srcdir" = "."; then
- if test "$with_target_subdir" != "."; then
- multi_basedir="$srcdir/$with_multisrctop../.."
- else
- multi_basedir="$srcdir/$with_multisrctop.."
- fi
-else
- multi_basedir="$srcdir/.."
-fi
+multi_basedir="$srcdir/.."
# Even if the default multilib is not a cross compilation,
@@ -6616,7 +6608,6 @@ srcdir="$srcdir"
host="$host"
target="$target"
with_multisubdir="$with_multisubdir"
-with_multisrctop="$with_multisrctop"
with_target_subdir="$with_target_subdir"
ac_configure_args="${multilib_arg} ${ac_configure_args}"
multi_basedir="$multi_basedir"
@@ -10,7 +10,6 @@
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
-MULTISRCTOP =
MULTIBUILDTOP =
MULTIDIRS =
MULTISUBDIR =
@@ -4305,7 +4305,6 @@ TARG_INCLUDE_CP_DIR = \
if (cd $$srcdir 2>/dev/null && [ "`echo *.h`" != "*.h" ]); then cp $$srcdir/*.h $$dstdir/; fi
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
-MULTISRCTOP =
MULTIBUILDTOP =
MULTIDIRS =
MULTISUBDIR =
@@ -94,19 +94,11 @@ AC_ARG_ENABLE(newlib-fno-builtin,
dnl We may get other options which we don't document:
-dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
+dnl --with-target-subdir, --with-multisubdir
test -z "[$]{with_target_subdir}" && with_target_subdir=.
-if test "[$]{srcdir}" = "."; then
- if test "[$]{with_target_subdir}" != "."; then
- newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
- else
- newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
- fi
-else
- newlib_basedir="[$]{srcdir}/$1"
-fi
+newlib_basedir="[$]{srcdir}/$1"
AC_SUBST(newlib_basedir)
abs_newlib_basedir=`cd "${newlib_basedir}" && pwd`
@@ -2648,18 +2648,10 @@ fi
# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
+# --with-target-subdir, --with-multisubdir
# See config-ml.in if you want the gory details.
-if test "$srcdir" = "."; then
- if test "$with_target_subdir" != "."; then
- multi_basedir="$srcdir/$with_multisrctop../.."
- else
- multi_basedir="$srcdir/$with_multisrctop.."
- fi
-else
- multi_basedir="$srcdir/.."
-fi
+multi_basedir="$srcdir/.."
# Even if the default multilib is not a cross compilation,
@@ -4872,15 +4864,7 @@ fi
test -z "${with_target_subdir}" && with_target_subdir=.
-if test "${srcdir}" = "."; then
- if test "${with_target_subdir}" != "."; then
- newlib_basedir="${srcdir}/${with_multisrctop}../."
- else
- newlib_basedir="${srcdir}/${with_multisrctop}."
- fi
-else
- newlib_basedir="${srcdir}/."
-fi
+newlib_basedir="${srcdir}/."
abs_newlib_basedir=`cd "${newlib_basedir}" && pwd`
@@ -8732,7 +8716,6 @@ srcdir="$srcdir"
host="$host"
target="$target"
with_multisubdir="$with_multisubdir"
-with_multisrctop="$with_multisrctop"
with_target_subdir="$with_target_subdir"
ac_configure_args="${multilib_arg} ${ac_configure_args}"
multi_basedir="$multi_basedir"
@@ -46,7 +46,7 @@ PWD = $${PWDCMD-pwd}
# Files in devo used in any net release.
DEVO_SUPPORT= README Makefile.in configure configure.ac \
config.guess config.sub config move-if-change \
- COPYING COPYING.LIB install-sh config-ml.in symlink-tree \
+ COPYING COPYING.LIB install-sh config-ml.in \
mkinstalldirs ltmain.sh missing ylwrap \
libtool.m4 ltsugar.m4 ltversion.m4 ltoptions.m4 \
Makefile.def Makefile.tpl src-release config.rpath \
deleted file mode 100755
@@ -1,78 +0,0 @@
-#!/bin/sh
-# Create a symlink tree.
-#
-# Copyright (C) 1995, 2000, 2003 Free Software Foundation, Inc.
-#
-# This file 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-#
-# Please report bugs to <gcc-bugs@gnu.org>
-# and send patches to <gcc-patches@gnu.org>.
-
-# Syntax: symlink-tree srcdir "ignore1 ignore2 ..."
-#
-# where srcdir is the directory to create a symlink tree to,
-# and "ignoreN" is a list of files/directories to ignore.
-
-prog=$0
-srcdir=$1
-ignore="$2"
-
-if test $# -lt 1; then
- echo "symlink-tree error: Usage: symlink-tree srcdir \"ignore1 ignore2 ...\""
- exit 1
-fi
-
-ignore_additional=". .. CVS"
-
-# If we were invoked with a relative path name, adjust ${prog} to work
-# in subdirs.
-case ${prog} in
-/* | [A-Za-z]:[\\/]*) ;;
-*) prog=../${prog} ;;
-esac
-
-# Set newsrcdir to something subdirectories can use.
-case ${srcdir} in
-/* | [A-Za-z]:[\\/]*) newsrcdir=${srcdir} ;;
-*) newsrcdir=../${srcdir} ;;
-esac
-
-for f in `ls -a ${srcdir}`; do
- if [ -d ${srcdir}/$f ]; then
- found=
- for i in ${ignore} ${ignore_additional}; do
- if [ "$f" = "$i" ]; then
- found=yes
- fi
- done
- if [ -z "${found}" ]; then
- echo "$f ..working in"
- if [ -d $f ]; then true; else mkdir $f; fi
- (cd $f; ${prog} ${newsrcdir}/$f "${ignore}")
- fi
- else
- echo "$f ..linked"
- rm -f $f
- ln -s ${srcdir}/$f .
- fi
-done
-
-exit 0