LoongArch: Link c++ header directory in the default ABI to the toplevel.
Checks
Commit Message
When multilib is enabled, the c++ header directory of the default multilib
variant needs to be linked to the toplevel since g++ does not search the
toplevel in this case.
libstdc++-v3/ChangeLog:
* configure.host: Register t-loongarch in tmake_file.
* config/cpu/loongarch/t-loongarch: New file. Link c++ header
directory in the default ABI to the toplevel.
---
libstdc++-v3/config/cpu/loongarch/t-loongarch | 12 ++++++++++++
libstdc++-v3/configure.host | 5 ++++-
2 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 libstdc++-v3/config/cpu/loongarch/t-loongarch
Comments
On Wed, 2023-09-06 at 18:06 +0800, Yang Yujie wrote:
> When multilib is enabled, the c++ header directory of the default multilib
> variant needs to be linked to the toplevel since g++ does not search the
> toplevel in this case.
>
> libstdc++-v3/ChangeLog:
>
> * configure.host: Register t-loongarch in tmake_file.
> * config/cpu/loongarch/t-loongarch: New file. Link c++ header
> directory in the default ABI to the toplevel.
> ---
> libstdc++-v3/config/cpu/loongarch/t-loongarch | 12 ++++++++++++
> libstdc++-v3/configure.host | 5 ++++-
> 2 files changed, 16 insertions(+), 1 deletion(-)
> create mode 100644 libstdc++-v3/config/cpu/loongarch/t-loongarch
>
> diff --git a/libstdc++-v3/config/cpu/loongarch/t-loongarch
> b/libstdc++-v3/config/cpu/loongarch/t-loongarch
> new file mode 100644
> index 00000000000..942eddeb3be
> --- /dev/null
> +++ b/libstdc++-v3/config/cpu/loongarch/t-loongarch
> @@ -0,0 +1,12 @@
> +LA_DEFAULT_MULTIDIR = $(shell $(CXX) --print-multi-directory)
> +TOPLEV_HEADERS = $(DESTDIR)${gxx_include_dir}/${host_alias}/$(LA_DEFAULT_MULTIDIR)
> +
> +.PHONY: install-toplevel-link
> +install: install-toplevel-link
> +install-toplevel-link:
> + if test x$(MULTIDO) != xtrue && \
> + test x$(LA_DEFAULT_MULTIDIR) != x.; then \
> + $(MKDIR_P) "$(dir $(TOPLEV_HEADERS))"; \
> + rm -rf "$(TOPLEV_HEADERS)"; \
> + $(LN_S) ../ "$(TOPLEV_HEADERS)"; \
From autoconf info page:
-- Macro: AC_PROG_LN_S
If ‘ln -s’ works on the current file system (the operating system
and file system support symbolic links), set the output variable
‘LN_S’ to ‘ln -s’; otherwise, if ‘ln’ works, set ‘LN_S’ to ‘ln’,
and otherwise set it to ‘cp -pR’.
If you make a link in a directory other than the current directory,
its meaning depends on whether ‘ln’ or ‘ln -s’ is used. To safely
create links using ‘$(LN_S)’, either find out which form is used
and adjust the arguments, or always invoke ‘ln’ in the directory
where the link is to be created.
In other words, it does not work to do:
$(LN_S) foo /x/bar
Instead, do:
(cd /x && $(LN_S) foo bar)
But for this special case we cannot "cp -pR ../ $(TOPLEV_HEADERS)"
either:
$ cp ../* -pR something
cp: cannot copy a directory, '../g', into itself, 'h/g'
So I guess we'll need something like
if ln -s ../ "$(TOPLEV_HEADERS)"; then
# OK!
true
else
# system does not support symlink :(
# install another copy of toplevel headers into default multilib subdir
TODO: ????????
fi
And all libstdc++ patches should Cc: libstdc++@gcc.gnu.org.
> + fi
> diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
> index 9e7c7f02dfd..9dc42ad3edb 100644
> --- a/libstdc++-v3/configure.host
> +++ b/libstdc++-v3/configure.host
> @@ -315,7 +315,10 @@ esac
> # Set any OS-dependent and CPU-dependent bits.
> # THIS TABLE IS SORTED. KEEP IT THAT WAY.
> case "${host}" in
> - *-*-linux* | *-*-uclinux*)
> + loongarch*)
> + tmake_file="cpu/loongarch/t-loongarch"
> + ;;
> + *-*-linux* | *-*-uclinux*)
> case "${host_cpu}" in
> i[567]86)
> abi_baseline_pair=i486-linux-gnu
On Wed, Sep 06, 2023 at 06:38:25PM +0800, Xi Ruoyao wrote:
> On Wed, 2023-09-06 at 18:06 +0800, Yang Yujie wrote:
> > When multilib is enabled, the c++ header directory of the default multilib
> > variant needs to be linked to the toplevel since g++ does not search the
> > toplevel in this case.
> >
> > libstdc++-v3/ChangeLog:
> >
> > * configure.host: Register t-loongarch in tmake_file.
> > * config/cpu/loongarch/t-loongarch: New file. Link c++ header
> > directory in the default ABI to the toplevel.
> > ---
> > libstdc++-v3/config/cpu/loongarch/t-loongarch | 12 ++++++++++++
> > libstdc++-v3/configure.host | 5 ++++-
> > 2 files changed, 16 insertions(+), 1 deletion(-)
> > create mode 100644 libstdc++-v3/config/cpu/loongarch/t-loongarch
> >
> > diff --git a/libstdc++-v3/config/cpu/loongarch/t-loongarch
> > b/libstdc++-v3/config/cpu/loongarch/t-loongarch
> > new file mode 100644
> > index 00000000000..942eddeb3be
> > --- /dev/null
> > +++ b/libstdc++-v3/config/cpu/loongarch/t-loongarch
> > @@ -0,0 +1,12 @@
> > +LA_DEFAULT_MULTIDIR = $(shell $(CXX) --print-multi-directory)
> > +TOPLEV_HEADERS = $(DESTDIR)${gxx_include_dir}/${host_alias}/$(LA_DEFAULT_MULTIDIR)
> > +
> > +.PHONY: install-toplevel-link
> > +install: install-toplevel-link
> > +install-toplevel-link:
> > + if test x$(MULTIDO) != xtrue && \
> > + test x$(LA_DEFAULT_MULTIDIR) != x.; then \
> > + $(MKDIR_P) "$(dir $(TOPLEV_HEADERS))"; \
> > + rm -rf "$(TOPLEV_HEADERS)"; \
> > + $(LN_S) ../ "$(TOPLEV_HEADERS)"; \
>
> From autoconf info page:
>
> -- Macro: AC_PROG_LN_S
> If ‘ln -s’ works on the current file system (the operating system
> and file system support symbolic links), set the output variable
> ‘LN_S’ to ‘ln -s’; otherwise, if ‘ln’ works, set ‘LN_S’ to ‘ln’,
> and otherwise set it to ‘cp -pR’.
>
> If you make a link in a directory other than the current directory,
> its meaning depends on whether ‘ln’ or ‘ln -s’ is used. To safely
> create links using ‘$(LN_S)’, either find out which form is used
> and adjust the arguments, or always invoke ‘ln’ in the directory
> where the link is to be created.
>
> In other words, it does not work to do:
> $(LN_S) foo /x/bar
>
> Instead, do:
>
> (cd /x && $(LN_S) foo bar)
>
> But for this special case we cannot "cp -pR ../ $(TOPLEV_HEADERS)"
> either:
>
> $ cp ../* -pR something
> cp: cannot copy a directory, '../g', into itself, 'h/g'
>
> So I guess we'll need something like
>
> if ln -s ../ "$(TOPLEV_HEADERS)"; then
> # OK!
> true
> else
> # system does not support symlink :(
> # install another copy of toplevel headers into default multilib subdir
> TODO: ????????
> fi
>
> And all libstdc++ patches should Cc: libstdc++@gcc.gnu.org.
>
> > + fi
> > diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
> > index 9e7c7f02dfd..9dc42ad3edb 100644
> > --- a/libstdc++-v3/configure.host
> > +++ b/libstdc++-v3/configure.host
> > @@ -315,7 +315,10 @@ esac
> > # Set any OS-dependent and CPU-dependent bits.
> > # THIS TABLE IS SORTED. KEEP IT THAT WAY.
> > case "${host}" in
> > - *-*-linux* | *-*-uclinux*)
> > + loongarch*)
> > + tmake_file="cpu/loongarch/t-loongarch"
> > + ;;
> > + *-*-linux* | *-*-uclinux*)
> > case "${host_cpu}" in
> > i[567]86)
> > abi_baseline_pair=i486-linux-gnu
>
> --
> Xi Ruoyao <xry111@xry111.site>
> School of Aerospace Science and Technology, Xidian University
Thanks for the review!
After some tweaking, it appeared that we can simply override
${multisubdir} in configure.host and achieve the same.
I will upload another patch soon.
Yujie
new file mode 100644
@@ -0,0 +1,12 @@
+LA_DEFAULT_MULTIDIR = $(shell $(CXX) --print-multi-directory)
+TOPLEV_HEADERS = $(DESTDIR)${gxx_include_dir}/${host_alias}/$(LA_DEFAULT_MULTIDIR)
+
+.PHONY: install-toplevel-link
+install: install-toplevel-link
+install-toplevel-link:
+ if test x$(MULTIDO) != xtrue && \
+ test x$(LA_DEFAULT_MULTIDIR) != x.; then \
+ $(MKDIR_P) "$(dir $(TOPLEV_HEADERS))"; \
+ rm -rf "$(TOPLEV_HEADERS)"; \
+ $(LN_S) ../ "$(TOPLEV_HEADERS)"; \
+ fi
@@ -315,7 +315,10 @@ esac
# Set any OS-dependent and CPU-dependent bits.
# THIS TABLE IS SORTED. KEEP IT THAT WAY.
case "${host}" in
- *-*-linux* | *-*-uclinux*)
+ loongarch*)
+ tmake_file="cpu/loongarch/t-loongarch"
+ ;;
+ *-*-linux* | *-*-uclinux*)
case "${host_cpu}" in
i[567]86)
abi_baseline_pair=i486-linux-gnu