[v2,2/4] libgrust: Add libproc_macro and build system

Message ID 20231025110658.1232737-3-arthur.cohen@embecosm.com
State Accepted
Headers
Series [v2,1/4] libgrust: Add entry for maintainers and stub changelog file. |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Arthur Cohen Oct. 25, 2023, 11:06 a.m. UTC
  From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

Add some dummy files in libproc_macro along with its build system.

libgrust/Changelog:

	* Makefile.am: New file.
	* configure.ac: New file.
	* libproc_macro/Makefile.am: New file.
	* libproc_macro/proc_macro.cc: New file.
	* libproc_macro/proc_macro.h: New file.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
---
 libgrust/Makefile.am                 |  68 ++++++++++++++++
 libgrust/configure.ac                | 113 +++++++++++++++++++++++++++
 libgrust/libproc_macro/Makefile.am   |  58 ++++++++++++++
 libgrust/libproc_macro/proc_macro.cc |   7 ++
 libgrust/libproc_macro/proc_macro.h  |   7 ++
 5 files changed, 253 insertions(+)
 create mode 100644 libgrust/Makefile.am
 create mode 100644 libgrust/configure.ac
 create mode 100644 libgrust/libproc_macro/Makefile.am
 create mode 100644 libgrust/libproc_macro/proc_macro.cc
 create mode 100644 libgrust/libproc_macro/proc_macro.h
  

Comments

Thomas Schwinge Oct. 26, 2023, 8:21 a.m. UTC | #1
Hi!

First, I've pushed into GCC upstream Git branch devel/rust/libgrust-v2
the "v2" libgrust changes as posted by Arthur, so that people can easily
test this before it getting into Git master branch.

I'll myself later try this for GCN and nvptx targets -- in their current
form where they don't support C++ (standard library), and in my hacky WIP
trees where C++ (standard library) is supported to some extent.  (This
should, roughly, match C++ functionality (not) provided by a number of
other GCC "embedded" targets.)


Then:

On 2023-10-25T13:06:46+0200, Arthur Cohen <arthur.cohen@embecosm.com> wrote:
> From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
>
> Add some dummy files in libproc_macro along with its build system.

I've not reviewed the build system in detail, just had a very quick look.

Three instances of 'librust'; should be 'libgrust':

    configure.ac:AC_INIT([libgrust], version-unused,,librust)

    configure.ac:AC_MSG_NOTICE([librust has been configured.])

    Makefile.am:        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \

Compared to libgomp (which I'm reasonably familiar with), I found missing
in 'libgrust' at 'configure'-level:

      --enable-multilib       build many library versions (default)

      --disable-werror        disable building with -Werror

      --enable-symvers=STYLE  enables symbol versioning of the shared library
                              [default=yes]

      --enable-cet            enable Intel CET in target libraries [default=auto]

      --with-gcc-major-version-only
                              use only GCC major number in filesystem paths

I can't tell off-hand whether all these are important, however.

Additionally, the new one that's being discussed in
<https://github.com/Rust-GCC/gccrs/issues/2714>
'Update libgrust for upstream GCC commit 6a6d3817afa02bbcd2388c8e005da6faf88932f1 "Config,Darwin: Allow for configuring Darwin to use embedded runpath"'.


Grüße
 Thomas


> libgrust/Changelog:
>
>       * Makefile.am: New file.
>       * configure.ac: New file.
>       * libproc_macro/Makefile.am: New file.
>       * libproc_macro/proc_macro.cc: New file.
>       * libproc_macro/proc_macro.h: New file.
>
> Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
> ---
>  libgrust/Makefile.am                 |  68 ++++++++++++++++
>  libgrust/configure.ac                | 113 +++++++++++++++++++++++++++
>  libgrust/libproc_macro/Makefile.am   |  58 ++++++++++++++
>  libgrust/libproc_macro/proc_macro.cc |   7 ++
>  libgrust/libproc_macro/proc_macro.h  |   7 ++
>  5 files changed, 253 insertions(+)
>  create mode 100644 libgrust/Makefile.am
>  create mode 100644 libgrust/configure.ac
>  create mode 100644 libgrust/libproc_macro/Makefile.am
>  create mode 100644 libgrust/libproc_macro/proc_macro.cc
>  create mode 100644 libgrust/libproc_macro/proc_macro.h
>
> diff --git a/libgrust/Makefile.am b/libgrust/Makefile.am
> new file mode 100644
> index 00000000000..8e5274922c5
> --- /dev/null
> +++ b/libgrust/Makefile.am
> @@ -0,0 +1,68 @@
> +AUTOMAKE_OPTIONS = 1.8 foreign
> +
> +SUFFIXES = .c .rs .def .o .lo .a
> +
> +ACLOCAL_AMFLAGS = -I . -I .. -I ../config
> +
> +AM_CFLAGS = -I $(srcdir)/../libgcc -I $(MULTIBUILDTOP)../../gcc/include
> +
> +TOP_GCCDIR := $(shell cd $(top_srcdir) && cd .. && pwd)
> +
> +GCC_DIR = $(TOP_GCCDIR)/gcc
> +RUST_SRC = $(GCC_DIR)/rust
> +
> +toolexeclibdir=@toolexeclibdir@
> +toolexecdir=@toolexecdir@
> +
> +SUBDIRS = libproc_macro
> +
> +RUST_BUILDDIR := $(shell pwd)
> +
> +# Work around what appears to be a GNU make bug handling MAKEFLAGS
> +# values defined in terms of make variables, as is the case for CC and
> +# friends when we are called from the top level Makefile.
> +AM_MAKEFLAGS = \
> +        "GCC_DIR=$(GCC_DIR)" \
> +        "RUST_SRC=$(RUST_SRC)" \
> +     "AR_FLAGS=$(AR_FLAGS)" \
> +     "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
> +     "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
> +     "RUST_FOR_TARGET=$(RUST_FOR_TARGET)" \
> +     "CFLAGS=$(CFLAGS)" \
> +     "CXXFLAGS=$(CXXFLAGS)" \
> +     "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
> +     "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
> +     "INSTALL=$(INSTALL)" \
> +     "INSTALL_DATA=$(INSTALL_DATA)" \
> +     "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
> +     "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
> +     "LDFLAGS=$(LDFLAGS)" \
> +     "LIBCFLAGS=$(LIBCFLAGS)" \
> +     "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
> +     "MAKE=$(MAKE)" \
> +     "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
> +     "PICFLAG=$(PICFLAG)" \
> +     "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
> +     "SHELL=$(SHELL)" \
> +     "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
> +     "exec_prefix=$(exec_prefix)" \
> +     "infodir=$(infodir)" \
> +     "libdir=$(libdir)" \
> +     "includedir=$(includedir)" \
> +     "prefix=$(prefix)" \
> +     "tooldir=$(tooldir)" \
> +     "gxx_include_dir=$(gxx_include_dir)" \
> +     "AR=$(AR)" \
> +     "AS=$(AS)" \
> +     "LD=$(LD)" \
> +     "RANLIB=$(RANLIB)" \
> +     "NM=$(NM)" \
> +     "NM_FOR_BUILD=$(NM_FOR_BUILD)" \
> +     "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
> +     "DESTDIR=$(DESTDIR)" \
> +     "WERROR=$(WERROR)" \
> +        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
> +        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \
> +     "LIBTOOL=$(RUST_BUILDDIR)/libtool"
> +
> +include $(top_srcdir)/../multilib.am
> diff --git a/libgrust/configure.ac b/libgrust/configure.ac
> new file mode 100644
> index 00000000000..7aed489a643
> --- /dev/null
> +++ b/libgrust/configure.ac
> @@ -0,0 +1,113 @@
> +AC_INIT([libgrust], version-unused,,librust)
> +AC_CONFIG_SRCDIR(Makefile.am)
> +AC_CONFIG_FILES([Makefile])
> +
> +# AM_ENABLE_MULTILIB(, ..)
> +
> +# Do not delete or change the following two lines.  For why, see
> +# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
> +AC_CANONICAL_SYSTEM
> +target_alias=${target_alias-$host_alias}
> +AC_SUBST(target_alias)
> +
> +# Automake should never attempt to rebuild configure
> +AM_MAINTAINER_MODE
> +
> +AM_INIT_AUTOMAKE([1.15.1 foreign no-dist -Wall])
> +
> +# Make sure we don't test executables when making cross-tools.
> +GCC_NO_EXECUTABLES
> +
> +
> +# Add the ability to change LIBTOOL directory
> +GCC_WITH_TOOLEXECLIBDIR
> +
> +# Use system specific extensions
> +AC_USE_SYSTEM_EXTENSIONS
> +
> +
> +# Checks for header files.
> +AC_HEADER_STDC
> +AC_HEADER_SYS_WAIT
> +AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h \
> +                 time.h sys/stat.h wchar.h)
> +
> +# Check for tools
> +AM_PROG_AR
> +AC_PROG_CC
> +AC_PROG_CXX
> +AM_PROG_AS
> +AC_PROG_MAKE_SET
> +AC_PROG_INSTALL
> +
> +# Enable libtool
> +LT_INIT
> +
> +# target_noncanonical variables...
> +AC_CANONICAL_HOST
> +ACX_NONCANONICAL_HOST
> +ACX_NONCANONICAL_TARGET
> +GCC_TOPLEV_SUBDIRS
> +
> +AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
> +AC_ARG_ENABLE(version-specific-runtime-libs,
> +[  --enable-version-specific-runtime-libs    Specify that runtime libraries should be installed in a compiler-specific directory ],
> +[case "$enableval" in
> + yes) version_specific_libs=yes ;;
> + no)  version_specific_libs=no ;;
> + *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
> + esac],
> +[version_specific_libs=no])
> +AC_MSG_RESULT($version_specific_libs)
> +
> +toolexecdir=no
> +toolexeclibdir=no
> +
> +# Calculate toolexeclibdir
> +# Also toolexecdir, though it's only used in toolexeclibdir
> +case ${version_specific_libs} in
> +  yes)
> +    # Need the gcc compiler version to know where to install libraries
> +    # and header files if --enable-version-specific-runtime-libs option
> +    # is selected.
> +    toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
> +    toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
> +    ;;
> +  no)
> +    if test -n "$with_cross_host" &&
> +       test x"$with_cross_host" != x"no"; then
> +      # Install a library built with a cross compiler in tooldir, not libdir.
> +      toolexecdir='$(exec_prefix)/$(target_noncanonical)'
> +      toolexeclibdir='$(toolexecdir)/lib'
> +    else
> +      toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
> +      toolexeclibdir='$(libdir)'
> +    fi
> +    multi_os_directory=`$CC -print-multi-os-directory`
> +    case $multi_os_directory in
> +      .) ;; # Avoid trailing /.
> +      *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
> +    esac
> +    ;;
> +esac
> +
> +AC_SUBST(toolexecdir)
> +AC_SUBST(toolexeclibdir)
> +
> +
> +AC_CONFIG_FILES(AC_FOREACH([DIR], [libproc_macro], [DIR/Makefile ]),
> + [ cat > vpsed$$ << \_EOF
> +s!`test -f '$<' || echo '$(srcdir)/'`!!
> +_EOF
> +   sed -f vpsed$$ $ac_file > tmp$$
> +   mv tmp$$ $ac_file
> +   rm vpsed$$
> +   echo 'MULTISUBDIR =' >> $ac_file
> +   ml_norecursion=yes
> +   AS_UNSET([ml_norecursion])
> +])
> +
> +
> +AC_MSG_NOTICE([librust has been configured.])
> +
> +AC_OUTPUT
> diff --git a/libgrust/libproc_macro/Makefile.am b/libgrust/libproc_macro/Makefile.am
> new file mode 100644
> index 00000000000..1e61d12e506
> --- /dev/null
> +++ b/libgrust/libproc_macro/Makefile.am
> @@ -0,0 +1,58 @@
> +SUFFIXES = .cc .o .a .lo .la
> +
> +ACLOCAL_AMFLAGS = -I .. -I ../../config
> +
> +toolexeclibdir=@toolexeclibdir@
> +toolexecdir=@toolexecdir@
> +
> +# Work around what appears to be a GNU make bug handling MAKEFLAGS
> +# values defined in terms of make variables, as is the case for CC and
> +# friends when we are called from the top level Makefile.
> +AM_MAKEFLAGS = \
> +     "AR_FLAGS=$(AR_FLAGS)" \
> +     "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
> +     "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
> +     "CFLAGS=$(CFLAGS)" \
> +     "CXXFLAGS=$(CXXFLAGS)" \
> +     "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
> +     "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
> +     "INSTALL=$(INSTALL)" \
> +     "INSTALL_DATA=$(INSTALL_DATA)" \
> +     "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
> +     "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
> +     "LDFLAGS=$(LDFLAGS)" \
> +     "LIBCFLAGS=$(LIBCFLAGS)" \
> +     "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
> +     "MAKE=$(MAKE)" \
> +     "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
> +     "PICFLAG=$(PICFLAG)" \
> +     "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
> +     "SHELL=$(SHELL)" \
> +     "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
> +     "exec_prefix=$(exec_prefix)" \
> +     "infodir=$(infodir)" \
> +     "libdir=$(libdir)" \
> +     "includedir=$(includedir)" \
> +     "prefix=$(prefix)" \
> +     "tooldir=$(tooldir)" \
> +     "gxx_include_dir=$(gxx_include_dir)" \
> +     "AR=$(AR)" \
> +     "AS=$(AS)" \
> +     "LD=$(LD)" \
> +     "RANLIB=$(RANLIB)" \
> +     "NM=$(NM)" \
> +     "NM_FOR_BUILD=$(NM_FOR_BUILD)" \
> +     "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
> +     "DESTDIR=$(DESTDIR)" \
> +     "WERROR=$(WERROR)" \
> +        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
> +        "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)"
> +
> +toolexeclib_LTLIBRARIES = libproc_macro.la
> +
> +libproc_macro_la_SOURCES = \
> +     proc_macro.cc
> +
> +include_HEADERS = \
> +     proc_macro.h
> +
> diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc
> new file mode 100644
> index 00000000000..d13276294aa
> --- /dev/null
> +++ b/libgrust/libproc_macro/proc_macro.cc
> @@ -0,0 +1,7 @@
> +#include "proc_macro.h"
> +
> +int
> +test ()
> +{
> +  return 0;
> +}
> diff --git a/libgrust/libproc_macro/proc_macro.h b/libgrust/libproc_macro/proc_macro.h
> new file mode 100644
> index 00000000000..2c96b3de685
> --- /dev/null
> +++ b/libgrust/libproc_macro/proc_macro.h
> @@ -0,0 +1,7 @@
> +#ifndef PROC_MACRO_H
> +#define PROC_MACRO_H
> +
> +int
> +test ();
> +
> +#endif /* ! PROC_MACRO_H */
> --
> 2.42.0
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  
Iain Sandoe Oct. 27, 2023, 7:51 a.m. UTC | #2
> On 26 Oct 2023, at 09:21, Thomas Schwinge <thomas@codesourcery.com> wrote:
> 
> Hi!
> 
> First, I've pushed into GCC upstream Git branch devel/rust/libgrust-v2
> the "v2" libgrust changes as posted by Arthur, so that people can easily
> test this before it getting into Git master branch.
> 
> I'll myself later try this for GCN and nvptx targets -- in their current
> form where they don't support C++ (standard library), and in my hacky WIP
> trees where C++ (standard library) is supported to some extent.  (This
> should, roughly, match C++ functionality (not) provided by a number of
> other GCC "embedded" targets.)

on Darwin, it works for later systems without multilibs, but fails to build multilibs.

—— so….

With the patch below bootstrap suceeded on x86_64-darwin17 and produced a correct
architecture multilib.  Of course, there is no way to test this at the moment - I’d suggest
that the next step might be something small in functionality that can allow at least one
test to be wired up.

^^^ this is “lightly tested” of course, as I cycle through other versions of the OS will see
how it pans out.

Do you want me to make a PR with this change against upstream?

Iain
> 
> 
> Then:
> 
> On 2023-10-25T13:06:46+0200, Arthur Cohen <arthur.cohen@embecosm.com> wrote:
>> From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
>> 
>> Add some dummy files in libproc_macro along with its build system.
> 
> I've not reviewed the build system in detail, just had a very quick look.
> 
> Three instances of 'librust'; should be 'libgrust':
> 
>    configure.ac:AC_INIT([libgrust], version-unused,,librust)
> 
>    configure.ac:AC_MSG_NOTICE([librust has been configured.])
> 
>    Makefile.am:        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \
> 
> Compared to libgomp (which I'm reasonably familiar with), I found missing
> in 'libgrust' at 'configure'-level:
> 
>      --enable-multilib       build many library versions (default)
> 
>      --disable-werror        disable building with -Werror
> 
>      --enable-symvers=STYLE  enables symbol versioning of the shared library
>                              [default=yes]
> 
>      --enable-cet            enable Intel CET in target libraries [default=auto]
> 
>      --with-gcc-major-version-only
>                              use only GCC major number in filesystem paths
> 
> I can't tell off-hand whether all these are important, however.
> 
> Additionally, the new one that's being discussed in
> <https://github.com/Rust-GCC/gccrs/issues/2714>
> 'Update libgrust for upstream GCC commit 6a6d3817afa02bbcd2388c8e005da6faf88932f1 "Config,Darwin: Allow for configuring Darwin to use embedded runpath"'.
> 
> 
> Grüße
> Thomas
> 
> 
>> libgrust/Changelog:
>> 
>>      * Makefile.am: New file.
>>      * configure.ac: New file.
>>      * libproc_macro/Makefile.am: New file.
>>      * libproc_macro/proc_macro.cc: New file.
>>      * libproc_macro/proc_macro.h: New file.
>> 
>> Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
>> ---
>> libgrust/Makefile.am                 |  68 ++++++++++++++++
>> libgrust/configure.ac                | 113 +++++++++++++++++++++++++++
>> libgrust/libproc_macro/Makefile.am   |  58 ++++++++++++++
>> libgrust/libproc_macro/proc_macro.cc |   7 ++
>> libgrust/libproc_macro/proc_macro.h  |   7 ++
>> 5 files changed, 253 insertions(+)
>> create mode 100644 libgrust/Makefile.am
>> create mode 100644 libgrust/configure.ac
>> create mode 100644 libgrust/libproc_macro/Makefile.am
>> create mode 100644 libgrust/libproc_macro/proc_macro.cc
>> create mode 100644 libgrust/libproc_macro/proc_macro.h
>> 
>> diff --git a/libgrust/Makefile.am b/libgrust/Makefile.am
>> new file mode 100644
>> index 00000000000..8e5274922c5
>> --- /dev/null
>> +++ b/libgrust/Makefile.am
>> @@ -0,0 +1,68 @@
>> +AUTOMAKE_OPTIONS = 1.8 foreign
>> +
>> +SUFFIXES = .c .rs .def .o .lo .a
>> +
>> +ACLOCAL_AMFLAGS = -I . -I .. -I ../config
>> +
>> +AM_CFLAGS = -I $(srcdir)/../libgcc -I $(MULTIBUILDTOP)../../gcc/include
>> +
>> +TOP_GCCDIR := $(shell cd $(top_srcdir) && cd .. && pwd)
>> +
>> +GCC_DIR = $(TOP_GCCDIR)/gcc
>> +RUST_SRC = $(GCC_DIR)/rust
>> +
>> +toolexeclibdir=@toolexeclibdir@
>> +toolexecdir=@toolexecdir@
>> +
>> +SUBDIRS = libproc_macro
>> +
>> +RUST_BUILDDIR := $(shell pwd)
>> +
>> +# Work around what appears to be a GNU make bug handling MAKEFLAGS
>> +# values defined in terms of make variables, as is the case for CC and
>> +# friends when we are called from the top level Makefile.
>> +AM_MAKEFLAGS = \
>> +        "GCC_DIR=$(GCC_DIR)" \
>> +        "RUST_SRC=$(RUST_SRC)" \
>> +     "AR_FLAGS=$(AR_FLAGS)" \
>> +     "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
>> +     "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
>> +     "RUST_FOR_TARGET=$(RUST_FOR_TARGET)" \
>> +     "CFLAGS=$(CFLAGS)" \
>> +     "CXXFLAGS=$(CXXFLAGS)" \
>> +     "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
>> +     "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
>> +     "INSTALL=$(INSTALL)" \
>> +     "INSTALL_DATA=$(INSTALL_DATA)" \
>> +     "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
>> +     "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
>> +     "LDFLAGS=$(LDFLAGS)" \
>> +     "LIBCFLAGS=$(LIBCFLAGS)" \
>> +     "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
>> +     "MAKE=$(MAKE)" \
>> +     "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
>> +     "PICFLAG=$(PICFLAG)" \
>> +     "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
>> +     "SHELL=$(SHELL)" \
>> +     "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
>> +     "exec_prefix=$(exec_prefix)" \
>> +     "infodir=$(infodir)" \
>> +     "libdir=$(libdir)" \
>> +     "includedir=$(includedir)" \
>> +     "prefix=$(prefix)" \
>> +     "tooldir=$(tooldir)" \
>> +     "gxx_include_dir=$(gxx_include_dir)" \
>> +     "AR=$(AR)" \
>> +     "AS=$(AS)" \
>> +     "LD=$(LD)" \
>> +     "RANLIB=$(RANLIB)" \
>> +     "NM=$(NM)" \
>> +     "NM_FOR_BUILD=$(NM_FOR_BUILD)" \
>> +     "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
>> +     "DESTDIR=$(DESTDIR)" \
>> +     "WERROR=$(WERROR)" \
>> +        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
>> +        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \
>> +     "LIBTOOL=$(RUST_BUILDDIR)/libtool"
>> +
>> +include $(top_srcdir)/../multilib.am
>> diff --git a/libgrust/configure.ac b/libgrust/configure.ac
>> new file mode 100644
>> index 00000000000..7aed489a643
>> --- /dev/null
>> +++ b/libgrust/configure.ac
>> @@ -0,0 +1,113 @@
>> +AC_INIT([libgrust], version-unused,,librust)
>> +AC_CONFIG_SRCDIR(Makefile.am)
>> +AC_CONFIG_FILES([Makefile])
>> +
>> +# AM_ENABLE_MULTILIB(, ..)
>> +
>> +# Do not delete or change the following two lines.  For why, see
>> +# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
>> +AC_CANONICAL_SYSTEM
>> +target_alias=${target_alias-$host_alias}
>> +AC_SUBST(target_alias)
>> +
>> +# Automake should never attempt to rebuild configure
>> +AM_MAINTAINER_MODE
>> +
>> +AM_INIT_AUTOMAKE([1.15.1 foreign no-dist -Wall])
>> +
>> +# Make sure we don't test executables when making cross-tools.
>> +GCC_NO_EXECUTABLES
>> +
>> +
>> +# Add the ability to change LIBTOOL directory
>> +GCC_WITH_TOOLEXECLIBDIR
>> +
>> +# Use system specific extensions
>> +AC_USE_SYSTEM_EXTENSIONS
>> +
>> +
>> +# Checks for header files.
>> +AC_HEADER_STDC
>> +AC_HEADER_SYS_WAIT
>> +AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h \
>> +                 time.h sys/stat.h wchar.h)
>> +
>> +# Check for tools
>> +AM_PROG_AR
>> +AC_PROG_CC
>> +AC_PROG_CXX
>> +AM_PROG_AS
>> +AC_PROG_MAKE_SET
>> +AC_PROG_INSTALL
>> +
>> +# Enable libtool
>> +LT_INIT
>> +
>> +# target_noncanonical variables...
>> +AC_CANONICAL_HOST
>> +ACX_NONCANONICAL_HOST
>> +ACX_NONCANONICAL_TARGET
>> +GCC_TOPLEV_SUBDIRS
>> +
>> +AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
>> +AC_ARG_ENABLE(version-specific-runtime-libs,
>> +[  --enable-version-specific-runtime-libs    Specify that runtime libraries should be installed in a compiler-specific directory ],
>> +[case "$enableval" in
>> + yes) version_specific_libs=yes ;;
>> + no)  version_specific_libs=no ;;
>> + *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
>> + esac],
>> +[version_specific_libs=no])
>> +AC_MSG_RESULT($version_specific_libs)
>> +
>> +toolexecdir=no
>> +toolexeclibdir=no
>> +
>> +# Calculate toolexeclibdir
>> +# Also toolexecdir, though it's only used in toolexeclibdir
>> +case ${version_specific_libs} in
>> +  yes)
>> +    # Need the gcc compiler version to know where to install libraries
>> +    # and header files if --enable-version-specific-runtime-libs option
>> +    # is selected.
>> +    toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
>> +    toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
>> +    ;;
>> +  no)
>> +    if test -n "$with_cross_host" &&
>> +       test x"$with_cross_host" != x"no"; then
>> +      # Install a library built with a cross compiler in tooldir, not libdir.
>> +      toolexecdir='$(exec_prefix)/$(target_noncanonical)'
>> +      toolexeclibdir='$(toolexecdir)/lib'
>> +    else
>> +      toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
>> +      toolexeclibdir='$(libdir)'
>> +    fi
>> +    multi_os_directory=`$CC -print-multi-os-directory`
>> +    case $multi_os_directory in
>> +      .) ;; # Avoid trailing /.
>> +      *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
>> +    esac
>> +    ;;
>> +esac
>> +
>> +AC_SUBST(toolexecdir)
>> +AC_SUBST(toolexeclibdir)
>> +
>> +
>> +AC_CONFIG_FILES(AC_FOREACH([DIR], [libproc_macro], [DIR/Makefile ]),
>> + [ cat > vpsed$$ << \_EOF
>> +s!`test -f '$<' || echo '$(srcdir)/'`!!
>> +_EOF
>> +   sed -f vpsed$$ $ac_file > tmp$$
>> +   mv tmp$$ $ac_file
>> +   rm vpsed$$
>> +   echo 'MULTISUBDIR =' >> $ac_file
>> +   ml_norecursion=yes
>> +   AS_UNSET([ml_norecursion])
>> +])
>> +
>> +
>> +AC_MSG_NOTICE([librust has been configured.])
>> +
>> +AC_OUTPUT
>> diff --git a/libgrust/libproc_macro/Makefile.am b/libgrust/libproc_macro/Makefile.am
>> new file mode 100644
>> index 00000000000..1e61d12e506
>> --- /dev/null
>> +++ b/libgrust/libproc_macro/Makefile.am
>> @@ -0,0 +1,58 @@
>> +SUFFIXES = .cc .o .a .lo .la
>> +
>> +ACLOCAL_AMFLAGS = -I .. -I ../../config
>> +
>> +toolexeclibdir=@toolexeclibdir@
>> +toolexecdir=@toolexecdir@
>> +
>> +# Work around what appears to be a GNU make bug handling MAKEFLAGS
>> +# values defined in terms of make variables, as is the case for CC and
>> +# friends when we are called from the top level Makefile.
>> +AM_MAKEFLAGS = \
>> +     "AR_FLAGS=$(AR_FLAGS)" \
>> +     "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
>> +     "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
>> +     "CFLAGS=$(CFLAGS)" \
>> +     "CXXFLAGS=$(CXXFLAGS)" \
>> +     "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
>> +     "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
>> +     "INSTALL=$(INSTALL)" \
>> +     "INSTALL_DATA=$(INSTALL_DATA)" \
>> +     "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
>> +     "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
>> +     "LDFLAGS=$(LDFLAGS)" \
>> +     "LIBCFLAGS=$(LIBCFLAGS)" \
>> +     "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
>> +     "MAKE=$(MAKE)" \
>> +     "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
>> +     "PICFLAG=$(PICFLAG)" \
>> +     "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
>> +     "SHELL=$(SHELL)" \
>> +     "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
>> +     "exec_prefix=$(exec_prefix)" \
>> +     "infodir=$(infodir)" \
>> +     "libdir=$(libdir)" \
>> +     "includedir=$(includedir)" \
>> +     "prefix=$(prefix)" \
>> +     "tooldir=$(tooldir)" \
>> +     "gxx_include_dir=$(gxx_include_dir)" \
>> +     "AR=$(AR)" \
>> +     "AS=$(AS)" \
>> +     "LD=$(LD)" \
>> +     "RANLIB=$(RANLIB)" \
>> +     "NM=$(NM)" \
>> +     "NM_FOR_BUILD=$(NM_FOR_BUILD)" \
>> +     "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
>> +     "DESTDIR=$(DESTDIR)" \
>> +     "WERROR=$(WERROR)" \
>> +        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
>> +        "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)"
>> +
>> +toolexeclib_LTLIBRARIES = libproc_macro.la
>> +
>> +libproc_macro_la_SOURCES = \
>> +     proc_macro.cc
>> +
>> +include_HEADERS = \
>> +     proc_macro.h
>> +
>> diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc
>> new file mode 100644
>> index 00000000000..d13276294aa
>> --- /dev/null
>> +++ b/libgrust/libproc_macro/proc_macro.cc
>> @@ -0,0 +1,7 @@
>> +#include "proc_macro.h"
>> +
>> +int
>> +test ()
>> +{
>> +  return 0;
>> +}
>> diff --git a/libgrust/libproc_macro/proc_macro.h b/libgrust/libproc_macro/proc_macro.h
>> new file mode 100644
>> index 00000000000..2c96b3de685
>> --- /dev/null
>> +++ b/libgrust/libproc_macro/proc_macro.h
>> @@ -0,0 +1,7 @@
>> +#ifndef PROC_MACRO_H
>> +#define PROC_MACRO_H
>> +
>> +int
>> +test ();
>> +
>> +#endif /* ! PROC_MACRO_H */
>> --
>> 2.42.0
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  
Thomas Schwinge Oct. 27, 2023, 2:20 p.m. UTC | #3
Hi!

Short Friday afternoon status update:

On 2023-10-27T08:51:12+0100, Iain Sandoe <iain@sandoe.co.uk> wrote:
>> On 26 Oct 2023, at 09:21, Thomas Schwinge <thomas@codesourcery.com> wrote:
>> First, I've pushed into GCC upstream Git branch devel/rust/libgrust-v2
>> the "v2" libgrust changes as posted by Arthur, so that people can easily
>> test this before it getting into Git master branch.
>>
>> I'll myself later try this for GCN and nvptx targets -- in their current
>> form where they don't support C++ (standard library)

Indeed, this currently fails to build:

    [...]
    make[3]: Entering directory `[...]/build-gcc/amdgcn-amdhsa/libgrust/libproc_macro'
    [...]
    libtool: compile:  [...]/build-gcc/./gcc/xg++ -B[...]/build-gcc/./gcc/ -nostdinc++ -funconfigured-libstdc++-v3 [...] -c [...]/source-gcc/libgrust/libproc_macro/proc_macro.cc
    xg++: error: unrecognized command-line option ‘-funconfigured-libstdc++-v3’
    make[3]: *** [proc_macro.lo] Error 1
    make[3]: Leaving directory `[...]/build-gcc/amdgcn-amdhsa/libgrust/libproc_macro'
    make[2]: *** [all-recursive] Error 1
    make[2]: Leaving directory `[...]/build-gcc/amdgcn-amdhsa/libgrust'
    make[1]: *** [all-target-libgrust] Error 2
    make[1]: Leaving directory `[...]/build-gcc'
    make: *** [all] Error 2

("error: unrecognized command-line option ‘-funconfigured-libstdc++-v3’"
indeed is the expected outcome if libstdc++ is not available, as I
understand.)

Same for nvptx-none target.

We need two things: (a) make sure that target libgrust build depends on
target libstdc++, and (b) disable target libgrust if target libstdc++ is
not available (and, later, gracefully handle that situation in the Rust
front end).

As far as I remember, patches exist for (a), and Arthur is going to
integrate/re-submit those.  Arthur, before re-submission, feel free to
first cherr-pick and push'these into the GCC upstream Git branch
devel/rust/libgrust-v2, so that I can re-test.  I'm not sure about (b),
whether that fell out of the (a) changes, too?  I can otherwise look into
that later.

>> and in my hacky WIP
>> trees where C++ (standard library) is supported to some extent.

This does built -- but the default multilib only, as Iain already
reported:

>> (This
>> should, roughly, match C++ functionality (not) provided by a number of
>> other GCC "embedded" targets.)
>
> on Darwin, it works for later systems without multilibs, but fails to build multilibs.

I see that, too.

> —— so….
>
> With the patch below bootstrap suceeded on x86_64-darwin17 and produced a correct
> architecture multilib.

Confirmed, thanks!

> Of course, there is no way to test this at the moment - I’d suggest
> that the next step might be something small in functionality that can allow at least one
> test to be wired up.

ACK.

> ^^^ this is “lightly tested” of course, as I cycle through other versions of the OS will see
> how it pans out.
>
> Do you want me to make a PR with this change against upstream?

Yes, please.  (But no hurry.)


Grüße
 Thomas


> From 027bc2c5255a6f1b75592e896dd99fac55bfb9b8 Mon Sep 17 00:00:00 2001
> From: Iain Sandoe <iain@sandoe.co.uk>
> Date: Thu, 26 Oct 2023 23:19:36 +0100
> Subject: [PATCH] libgrust: enable multilib
>
> Most of this change is the regenerated files, the multilib config macro
> was already present, but commented out.
>
> libgrust/ChangeLog:
>
>       * Makefile.in:
>       * aclocal.m4: Regenerate.
>       * configure: Regenerate.
>       * configure.ac: Uncomment AM_ENABLE_MULTILIB.
>       * libproc_macro/Makefile.in:
>
> Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
> ---
>  libgrust/Makefile.in               |  2 +
>  libgrust/aclocal.m4                |  1 +
>  libgrust/configure                 | 68 ++++++++++++++++++++++++++++--
>  libgrust/configure.ac              |  2 +-
>  libgrust/libproc_macro/Makefile.in |  2 +
>  5 files changed, 71 insertions(+), 4 deletions(-)
>
> diff --git a/libgrust/Makefile.in b/libgrust/Makefile.in
> index bc9b6cc227a..2dc39adff24 100644
> --- a/libgrust/Makefile.in
> +++ b/libgrust/Makefile.in
> @@ -93,6 +93,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
>  am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
>       $(top_srcdir)/../config/depstand.m4 \
>       $(top_srcdir)/../config/lead-dot.m4 \
> +     $(top_srcdir)/../config/multi.m4 \
>       $(top_srcdir)/../config/no-executables.m4 \
>       $(top_srcdir)/../config/override.m4 \
>       $(top_srcdir)/../config/toolexeclibdir.m4 \
> @@ -275,6 +276,7 @@ localedir = @localedir@
>  localstatedir = @localstatedir@
>  mandir = @mandir@
>  mkdir_p = @mkdir_p@
> +multi_basedir = @multi_basedir@
>  oldincludedir = @oldincludedir@
>  pdfdir = @pdfdir@
>  prefix = @prefix@
> diff --git a/libgrust/aclocal.m4 b/libgrust/aclocal.m4
> index 1bd42c34d74..5d808f05afa 100644
> --- a/libgrust/aclocal.m4
> +++ b/libgrust/aclocal.m4
> @@ -1250,6 +1250,7 @@ AC_SUBST([am__untar])
>  m4_include([../config/acx.m4])
>  m4_include([../config/depstand.m4])
>  m4_include([../config/lead-dot.m4])
> +m4_include([../config/multi.m4])
>  m4_include([../config/no-executables.m4])
>  m4_include([../config/override.m4])
>  m4_include([../config/toolexeclibdir.m4])
> diff --git a/libgrust/configure b/libgrust/configure
> index 2756bddd10b..282027873bd 100755
> --- a/libgrust/configure
> +++ b/libgrust/configure
> @@ -732,6 +732,7 @@ build_os
>  build_vendor
>  build_cpu
>  build
> +multi_basedir
>  target_alias
>  host_alias
>  build_alias
> @@ -773,6 +774,7 @@ SHELL'
>  ac_subst_files=''
>  ac_user_opts='
>  enable_option_checking
> +enable_multilib
>  enable_maintainer_mode
>  enable_silent_rules
>  with_toolexeclibdir
> @@ -1421,6 +1423,7 @@ Optional Features:
>    --disable-option-checking  ignore unrecognized --enable/--with options
>    --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
>    --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
> +  --enable-multilib       build many library versions (default)
>    --enable-maintainer-mode
>                            enable make rules and dependencies not useful (and
>                            sometimes confusing) to the casual installer
> @@ -2376,7 +2379,43 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
>  ac_config_files="$ac_config_files Makefile"
>
>
> -# AM_ENABLE_MULTILIB(, ..)
> +# Default to --enable-multilib
> +# Check whether --enable-multilib was given.
> +if test "${enable_multilib+set}" = set; then :
> +  enableval=$enable_multilib; case "$enableval" in
> +  yes) multilib=yes ;;
> +  no)  multilib=no ;;
> +  *)   as_fn_error $? "bad value $enableval for multilib option" "$LINENO" 5 ;;
> + esac
> +else
> +  multilib=yes
> +fi
> +
> +
> +# We may get other options which we leave undocumented:
> +# --with-target-subdir, --with-multisrctop, --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
> +
> +
> +# Even if the default multilib is not a cross compilation,
> +# it may be that some of the other multilibs are.
> +if test $cross_compiling = no && test $multilib = yes \
> +   && test "x${with_multisubdir}" != x ; then
> +   cross_compiling=maybe
> +fi
> +
> +ac_config_commands="$ac_config_commands default-1"
> +
>
>  # Do not delete or change the following two lines.  For why, see
>  # http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
> @@ -12512,7 +12551,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 12515 "configure"
> +#line 12554 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -12618,7 +12657,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 12621 "configure"
> +#line 12660 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -16804,6 +16843,20 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
>  #
>  # INIT-COMMANDS
>  #
> +
> +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"
> +CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
> +CC="$CC"
> +CXX="$CXX"
> +GFORTRAN="$GFORTRAN"
> +GDC="$GDC"
>  AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
>
>
> @@ -17175,6 +17228,7 @@ for ac_config_target in $ac_config_targets
>  do
>    case $ac_config_target in
>      "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
> +    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
>      "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
>      "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
>      "libproc_macro/Makefile") CONFIG_FILES="$CONFIG_FILES libproc_macro/Makefile" ;;
> @@ -17607,6 +17661,14 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
>
>
>    case $ac_file$ac_mode in
> +    "default-1":C)
> +# Only add multilib support code if we just rebuilt the top-level
> +# Makefile.
> +case " $CONFIG_FILES " in
> + *" Makefile "*)
> +   ac_file=Makefile . ${multi_basedir}/config-ml.in
> +   ;;
> +esac ;;
>      "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
>    # Older Autoconf quotes --file arguments for eval, but not when files
>    # are listed without --file.  Let's play safe and only enable the eval
> diff --git a/libgrust/configure.ac b/libgrust/configure.ac
> index 7aed489a643..d75aa632462 100644
> --- a/libgrust/configure.ac
> +++ b/libgrust/configure.ac
> @@ -2,7 +2,7 @@ AC_INIT([libgrust], version-unused,,librust)
>  AC_CONFIG_SRCDIR(Makefile.am)
>  AC_CONFIG_FILES([Makefile])
>
> -# AM_ENABLE_MULTILIB(, ..)
> +AM_ENABLE_MULTILIB(, ..)
>
>  # Do not delete or change the following two lines.  For why, see
>  # http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
> diff --git a/libgrust/libproc_macro/Makefile.in b/libgrust/libproc_macro/Makefile.in
> index d3a39736679..46eb6484094 100644
> --- a/libgrust/libproc_macro/Makefile.in
> +++ b/libgrust/libproc_macro/Makefile.in
> @@ -95,6 +95,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
>  am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
>       $(top_srcdir)/../config/depstand.m4 \
>       $(top_srcdir)/../config/lead-dot.m4 \
> +     $(top_srcdir)/../config/multi.m4 \
>       $(top_srcdir)/../config/no-executables.m4 \
>       $(top_srcdir)/../config/override.m4 \
>       $(top_srcdir)/../config/toolexeclibdir.m4 \
> @@ -316,6 +317,7 @@ localedir = @localedir@
>  localstatedir = @localstatedir@
>  mandir = @mandir@
>  mkdir_p = @mkdir_p@
> +multi_basedir = @multi_basedir@
>  oldincludedir = @oldincludedir@
>  pdfdir = @pdfdir@
>  prefix = @prefix@
> --
> 2.39.2 (Apple Git-143)
>
>
>>
>>
>> Then:
>>
>> On 2023-10-25T13:06:46+0200, Arthur Cohen <arthur.cohen@embecosm.com> wrote:
>>> From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
>>>
>>> Add some dummy files in libproc_macro along with its build system.
>>
>> I've not reviewed the build system in detail, just had a very quick look.
>>
>> Three instances of 'librust'; should be 'libgrust':
>>
>>    configure.ac:AC_INIT([libgrust], version-unused,,librust)
>>
>>    configure.ac:AC_MSG_NOTICE([librust has been configured.])
>>
>>    Makefile.am:        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \
>>
>> Compared to libgomp (which I'm reasonably familiar with), I found missing
>> in 'libgrust' at 'configure'-level:
>>
>>      --enable-multilib       build many library versions (default)
>>
>>      --disable-werror        disable building with -Werror
>>
>>      --enable-symvers=STYLE  enables symbol versioning of the shared library
>>                              [default=yes]
>>
>>      --enable-cet            enable Intel CET in target libraries [default=auto]
>>
>>      --with-gcc-major-version-only
>>                              use only GCC major number in filesystem paths
>>
>> I can't tell off-hand whether all these are important, however.
>>
>> Additionally, the new one that's being discussed in
>> <https://github.com/Rust-GCC/gccrs/issues/2714>
>> 'Update libgrust for upstream GCC commit 6a6d3817afa02bbcd2388c8e005da6faf88932f1 "Config,Darwin: Allow for configuring Darwin to use embedded runpath"'.
>>
>>
>> Grüße
>> Thomas
>>
>>
>>> libgrust/Changelog:
>>>
>>>      * Makefile.am: New file.
>>>      * configure.ac: New file.
>>>      * libproc_macro/Makefile.am: New file.
>>>      * libproc_macro/proc_macro.cc: New file.
>>>      * libproc_macro/proc_macro.h: New file.
>>>
>>> Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
>>> ---
>>> libgrust/Makefile.am                 |  68 ++++++++++++++++
>>> libgrust/configure.ac                | 113 +++++++++++++++++++++++++++
>>> libgrust/libproc_macro/Makefile.am   |  58 ++++++++++++++
>>> libgrust/libproc_macro/proc_macro.cc |   7 ++
>>> libgrust/libproc_macro/proc_macro.h  |   7 ++
>>> 5 files changed, 253 insertions(+)
>>> create mode 100644 libgrust/Makefile.am
>>> create mode 100644 libgrust/configure.ac
>>> create mode 100644 libgrust/libproc_macro/Makefile.am
>>> create mode 100644 libgrust/libproc_macro/proc_macro.cc
>>> create mode 100644 libgrust/libproc_macro/proc_macro.h
>>>
>>> diff --git a/libgrust/Makefile.am b/libgrust/Makefile.am
>>> new file mode 100644
>>> index 00000000000..8e5274922c5
>>> --- /dev/null
>>> +++ b/libgrust/Makefile.am
>>> @@ -0,0 +1,68 @@
>>> +AUTOMAKE_OPTIONS = 1.8 foreign
>>> +
>>> +SUFFIXES = .c .rs .def .o .lo .a
>>> +
>>> +ACLOCAL_AMFLAGS = -I . -I .. -I ../config
>>> +
>>> +AM_CFLAGS = -I $(srcdir)/../libgcc -I $(MULTIBUILDTOP)../../gcc/include
>>> +
>>> +TOP_GCCDIR := $(shell cd $(top_srcdir) && cd .. && pwd)
>>> +
>>> +GCC_DIR = $(TOP_GCCDIR)/gcc
>>> +RUST_SRC = $(GCC_DIR)/rust
>>> +
>>> +toolexeclibdir=@toolexeclibdir@
>>> +toolexecdir=@toolexecdir@
>>> +
>>> +SUBDIRS = libproc_macro
>>> +
>>> +RUST_BUILDDIR := $(shell pwd)
>>> +
>>> +# Work around what appears to be a GNU make bug handling MAKEFLAGS
>>> +# values defined in terms of make variables, as is the case for CC and
>>> +# friends when we are called from the top level Makefile.
>>> +AM_MAKEFLAGS = \
>>> +        "GCC_DIR=$(GCC_DIR)" \
>>> +        "RUST_SRC=$(RUST_SRC)" \
>>> +     "AR_FLAGS=$(AR_FLAGS)" \
>>> +     "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
>>> +     "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
>>> +     "RUST_FOR_TARGET=$(RUST_FOR_TARGET)" \
>>> +     "CFLAGS=$(CFLAGS)" \
>>> +     "CXXFLAGS=$(CXXFLAGS)" \
>>> +     "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
>>> +     "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
>>> +     "INSTALL=$(INSTALL)" \
>>> +     "INSTALL_DATA=$(INSTALL_DATA)" \
>>> +     "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
>>> +     "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
>>> +     "LDFLAGS=$(LDFLAGS)" \
>>> +     "LIBCFLAGS=$(LIBCFLAGS)" \
>>> +     "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
>>> +     "MAKE=$(MAKE)" \
>>> +     "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
>>> +     "PICFLAG=$(PICFLAG)" \
>>> +     "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
>>> +     "SHELL=$(SHELL)" \
>>> +     "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
>>> +     "exec_prefix=$(exec_prefix)" \
>>> +     "infodir=$(infodir)" \
>>> +     "libdir=$(libdir)" \
>>> +     "includedir=$(includedir)" \
>>> +     "prefix=$(prefix)" \
>>> +     "tooldir=$(tooldir)" \
>>> +     "gxx_include_dir=$(gxx_include_dir)" \
>>> +     "AR=$(AR)" \
>>> +     "AS=$(AS)" \
>>> +     "LD=$(LD)" \
>>> +     "RANLIB=$(RANLIB)" \
>>> +     "NM=$(NM)" \
>>> +     "NM_FOR_BUILD=$(NM_FOR_BUILD)" \
>>> +     "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
>>> +     "DESTDIR=$(DESTDIR)" \
>>> +     "WERROR=$(WERROR)" \
>>> +        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
>>> +        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \
>>> +     "LIBTOOL=$(RUST_BUILDDIR)/libtool"
>>> +
>>> +include $(top_srcdir)/../multilib.am
>>> diff --git a/libgrust/configure.ac b/libgrust/configure.ac
>>> new file mode 100644
>>> index 00000000000..7aed489a643
>>> --- /dev/null
>>> +++ b/libgrust/configure.ac
>>> @@ -0,0 +1,113 @@
>>> +AC_INIT([libgrust], version-unused,,librust)
>>> +AC_CONFIG_SRCDIR(Makefile.am)
>>> +AC_CONFIG_FILES([Makefile])
>>> +
>>> +# AM_ENABLE_MULTILIB(, ..)
>>> +
>>> +# Do not delete or change the following two lines.  For why, see
>>> +# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
>>> +AC_CANONICAL_SYSTEM
>>> +target_alias=${target_alias-$host_alias}
>>> +AC_SUBST(target_alias)
>>> +
>>> +# Automake should never attempt to rebuild configure
>>> +AM_MAINTAINER_MODE
>>> +
>>> +AM_INIT_AUTOMAKE([1.15.1 foreign no-dist -Wall])
>>> +
>>> +# Make sure we don't test executables when making cross-tools.
>>> +GCC_NO_EXECUTABLES
>>> +
>>> +
>>> +# Add the ability to change LIBTOOL directory
>>> +GCC_WITH_TOOLEXECLIBDIR
>>> +
>>> +# Use system specific extensions
>>> +AC_USE_SYSTEM_EXTENSIONS
>>> +
>>> +
>>> +# Checks for header files.
>>> +AC_HEADER_STDC
>>> +AC_HEADER_SYS_WAIT
>>> +AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h \
>>> +                 time.h sys/stat.h wchar.h)
>>> +
>>> +# Check for tools
>>> +AM_PROG_AR
>>> +AC_PROG_CC
>>> +AC_PROG_CXX
>>> +AM_PROG_AS
>>> +AC_PROG_MAKE_SET
>>> +AC_PROG_INSTALL
>>> +
>>> +# Enable libtool
>>> +LT_INIT
>>> +
>>> +# target_noncanonical variables...
>>> +AC_CANONICAL_HOST
>>> +ACX_NONCANONICAL_HOST
>>> +ACX_NONCANONICAL_TARGET
>>> +GCC_TOPLEV_SUBDIRS
>>> +
>>> +AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
>>> +AC_ARG_ENABLE(version-specific-runtime-libs,
>>> +[  --enable-version-specific-runtime-libs    Specify that runtime libraries should be installed in a compiler-specific directory ],
>>> +[case "$enableval" in
>>> + yes) version_specific_libs=yes ;;
>>> + no)  version_specific_libs=no ;;
>>> + *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
>>> + esac],
>>> +[version_specific_libs=no])
>>> +AC_MSG_RESULT($version_specific_libs)
>>> +
>>> +toolexecdir=no
>>> +toolexeclibdir=no
>>> +
>>> +# Calculate toolexeclibdir
>>> +# Also toolexecdir, though it's only used in toolexeclibdir
>>> +case ${version_specific_libs} in
>>> +  yes)
>>> +    # Need the gcc compiler version to know where to install libraries
>>> +    # and header files if --enable-version-specific-runtime-libs option
>>> +    # is selected.
>>> +    toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
>>> +    toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
>>> +    ;;
>>> +  no)
>>> +    if test -n "$with_cross_host" &&
>>> +       test x"$with_cross_host" != x"no"; then
>>> +      # Install a library built with a cross compiler in tooldir, not libdir.
>>> +      toolexecdir='$(exec_prefix)/$(target_noncanonical)'
>>> +      toolexeclibdir='$(toolexecdir)/lib'
>>> +    else
>>> +      toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
>>> +      toolexeclibdir='$(libdir)'
>>> +    fi
>>> +    multi_os_directory=`$CC -print-multi-os-directory`
>>> +    case $multi_os_directory in
>>> +      .) ;; # Avoid trailing /.
>>> +      *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
>>> +    esac
>>> +    ;;
>>> +esac
>>> +
>>> +AC_SUBST(toolexecdir)
>>> +AC_SUBST(toolexeclibdir)
>>> +
>>> +
>>> +AC_CONFIG_FILES(AC_FOREACH([DIR], [libproc_macro], [DIR/Makefile ]),
>>> + [ cat > vpsed$$ << \_EOF
>>> +s!`test -f '$<' || echo '$(srcdir)/'`!!
>>> +_EOF
>>> +   sed -f vpsed$$ $ac_file > tmp$$
>>> +   mv tmp$$ $ac_file
>>> +   rm vpsed$$
>>> +   echo 'MULTISUBDIR =' >> $ac_file
>>> +   ml_norecursion=yes
>>> +   AS_UNSET([ml_norecursion])
>>> +])
>>> +
>>> +
>>> +AC_MSG_NOTICE([librust has been configured.])
>>> +
>>> +AC_OUTPUT
>>> diff --git a/libgrust/libproc_macro/Makefile.am b/libgrust/libproc_macro/Makefile.am
>>> new file mode 100644
>>> index 00000000000..1e61d12e506
>>> --- /dev/null
>>> +++ b/libgrust/libproc_macro/Makefile.am
>>> @@ -0,0 +1,58 @@
>>> +SUFFIXES = .cc .o .a .lo .la
>>> +
>>> +ACLOCAL_AMFLAGS = -I .. -I ../../config
>>> +
>>> +toolexeclibdir=@toolexeclibdir@
>>> +toolexecdir=@toolexecdir@
>>> +
>>> +# Work around what appears to be a GNU make bug handling MAKEFLAGS
>>> +# values defined in terms of make variables, as is the case for CC and
>>> +# friends when we are called from the top level Makefile.
>>> +AM_MAKEFLAGS = \
>>> +     "AR_FLAGS=$(AR_FLAGS)" \
>>> +     "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
>>> +     "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
>>> +     "CFLAGS=$(CFLAGS)" \
>>> +     "CXXFLAGS=$(CXXFLAGS)" \
>>> +     "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
>>> +     "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
>>> +     "INSTALL=$(INSTALL)" \
>>> +     "INSTALL_DATA=$(INSTALL_DATA)" \
>>> +     "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
>>> +     "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
>>> +     "LDFLAGS=$(LDFLAGS)" \
>>> +     "LIBCFLAGS=$(LIBCFLAGS)" \
>>> +     "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
>>> +     "MAKE=$(MAKE)" \
>>> +     "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
>>> +     "PICFLAG=$(PICFLAG)" \
>>> +     "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
>>> +     "SHELL=$(SHELL)" \
>>> +     "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
>>> +     "exec_prefix=$(exec_prefix)" \
>>> +     "infodir=$(infodir)" \
>>> +     "libdir=$(libdir)" \
>>> +     "includedir=$(includedir)" \
>>> +     "prefix=$(prefix)" \
>>> +     "tooldir=$(tooldir)" \
>>> +     "gxx_include_dir=$(gxx_include_dir)" \
>>> +     "AR=$(AR)" \
>>> +     "AS=$(AS)" \
>>> +     "LD=$(LD)" \
>>> +     "RANLIB=$(RANLIB)" \
>>> +     "NM=$(NM)" \
>>> +     "NM_FOR_BUILD=$(NM_FOR_BUILD)" \
>>> +     "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
>>> +     "DESTDIR=$(DESTDIR)" \
>>> +     "WERROR=$(WERROR)" \
>>> +        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
>>> +        "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)"
>>> +
>>> +toolexeclib_LTLIBRARIES = libproc_macro.la
>>> +
>>> +libproc_macro_la_SOURCES = \
>>> +     proc_macro.cc
>>> +
>>> +include_HEADERS = \
>>> +     proc_macro.h
>>> +
>>> diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc
>>> new file mode 100644
>>> index 00000000000..d13276294aa
>>> --- /dev/null
>>> +++ b/libgrust/libproc_macro/proc_macro.cc
>>> @@ -0,0 +1,7 @@
>>> +#include "proc_macro.h"
>>> +
>>> +int
>>> +test ()
>>> +{
>>> +  return 0;
>>> +}
>>> diff --git a/libgrust/libproc_macro/proc_macro.h b/libgrust/libproc_macro/proc_macro.h
>>> new file mode 100644
>>> index 00000000000..2c96b3de685
>>> --- /dev/null
>>> +++ b/libgrust/libproc_macro/proc_macro.h
>>> @@ -0,0 +1,7 @@
>>> +#ifndef PROC_MACRO_H
>>> +#define PROC_MACRO_H
>>> +
>>> +int
>>> +test ();
>>> +
>>> +#endif /* ! PROC_MACRO_H */
>>> --
>>> 2.42.0
>> -----------------
>> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  
Thomas Schwinge Dec. 15, 2023, 9:53 a.m. UTC | #4
Hi Jason!

I think you usually deal with these kind of GCC Git things?  If not,
please let me know.

On 2023-10-26T10:21:18+0200, I wrote:
> First, I've pushed into GCC upstream Git branch devel/rust/libgrust-v2
> the "v2" libgrust changes as posted by Arthur, so that people can easily
> test this before it getting into Git master branch.  [...]

Please now delete the GCC Git 'devel/rust/libgrust-v2' branch, which was
only used temporarily, and is now obsolete.

    $ git push upstream :devel/rust/libgrust-v2
    remote: *** Deleting branch 'devel/rust/libgrust-v2' is not allowed.
    remote: *** 
    remote: *** This repository currently only allow the deletion of references
    remote: *** whose name matches the following:
    remote: *** 
    remote: ***     refs/users/[^/]*/heads/.*
    remote: ***     refs/vendors/[^/]*/heads/.*
    remote: *** 
    remote: *** Branch deletion is only allowed for user and vendor branches.  If another branch was created by mistake, contact an administrator to delete it on the server with git update-ref.  If a development branch is dead, also contact an administrator to move it under refs/dead/heads/ rather than deleting it.
    remote: error: hook declined to update refs/heads/devel/rust/libgrust-v2
    To git+ssh://gcc.gnu.org/git/gcc.git
     ! [remote rejected]           devel/rust/libgrust-v2 (hook declined)
    error: failed to push some refs to 'git+ssh://gcc.gnu.org/git/gcc.git'


Grüße
 Thomas
  
Jason Merrill Jan. 16, 2024, 3:07 p.m. UTC | #5
On 12/15/23 04:53, Thomas Schwinge wrote:
> Hi Jason!
> 
> I think you usually deal with these kind of GCC Git things?  If not,
> please let me know.

I just took care of this; I didn't notice it until now because the 
subject line didn't seem relevant to me.

> On 2023-10-26T10:21:18+0200, I wrote:
>> First, I've pushed into GCC upstream Git branch devel/rust/libgrust-v2
>> the "v2" libgrust changes as posted by Arthur, so that people can easily
>> test this before it getting into Git master branch.  [...]
> 
> Please now delete the GCC Git 'devel/rust/libgrust-v2' branch, which was
> only used temporarily, and is now obsolete.
> 
>      $ git push upstream :devel/rust/libgrust-v2
>      remote: *** Deleting branch 'devel/rust/libgrust-v2' is not allowed.
>      remote: ***
>      remote: *** This repository currently only allow the deletion of references
>      remote: *** whose name matches the following:
>      remote: ***
>      remote: ***     refs/users/[^/]*/heads/.*
>      remote: ***     refs/vendors/[^/]*/heads/.*
>      remote: ***
>      remote: *** Branch deletion is only allowed for user and vendor branches.  If another branch was created by mistake, contact an administrator to delete it on the server with git update-ref.  If a development branch is dead, also contact an administrator to move it under refs/dead/heads/ rather than deleting it.
>      remote: error: hook declined to update refs/heads/devel/rust/libgrust-v2
>      To git+ssh://gcc.gnu.org/git/gcc.git
>       ! [remote rejected]           devel/rust/libgrust-v2 (hook declined)
>      error: failed to push some refs to 'git+ssh://gcc.gnu.org/git/gcc.git'
> 
> 
> Grüße
>   Thomas
>
  

Patch

diff --git a/libgrust/Makefile.am b/libgrust/Makefile.am
new file mode 100644
index 00000000000..8e5274922c5
--- /dev/null
+++ b/libgrust/Makefile.am
@@ -0,0 +1,68 @@ 
+AUTOMAKE_OPTIONS = 1.8 foreign
+
+SUFFIXES = .c .rs .def .o .lo .a
+
+ACLOCAL_AMFLAGS = -I . -I .. -I ../config
+
+AM_CFLAGS = -I $(srcdir)/../libgcc -I $(MULTIBUILDTOP)../../gcc/include
+
+TOP_GCCDIR := $(shell cd $(top_srcdir) && cd .. && pwd)
+
+GCC_DIR = $(TOP_GCCDIR)/gcc
+RUST_SRC = $(GCC_DIR)/rust
+
+toolexeclibdir=@toolexeclibdir@
+toolexecdir=@toolexecdir@
+
+SUBDIRS = libproc_macro
+
+RUST_BUILDDIR := $(shell pwd)
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+        "GCC_DIR=$(GCC_DIR)" \
+        "RUST_SRC=$(RUST_SRC)" \
+	"AR_FLAGS=$(AR_FLAGS)" \
+	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+	"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
+	"RUST_FOR_TARGET=$(RUST_FOR_TARGET)" \
+	"CFLAGS=$(CFLAGS)" \
+	"CXXFLAGS=$(CXXFLAGS)" \
+	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+	"INSTALL=$(INSTALL)" \
+	"INSTALL_DATA=$(INSTALL_DATA)" \
+	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+	"LDFLAGS=$(LDFLAGS)" \
+	"LIBCFLAGS=$(LIBCFLAGS)" \
+	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+	"MAKE=$(MAKE)" \
+	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+	"PICFLAG=$(PICFLAG)" \
+	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+	"SHELL=$(SHELL)" \
+	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+	"exec_prefix=$(exec_prefix)" \
+	"infodir=$(infodir)" \
+	"libdir=$(libdir)" \
+	"includedir=$(includedir)" \
+	"prefix=$(prefix)" \
+	"tooldir=$(tooldir)" \
+	"gxx_include_dir=$(gxx_include_dir)" \
+	"AR=$(AR)" \
+	"AS=$(AS)" \
+	"LD=$(LD)" \
+	"RANLIB=$(RANLIB)" \
+	"NM=$(NM)" \
+	"NM_FOR_BUILD=$(NM_FOR_BUILD)" \
+	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
+	"DESTDIR=$(DESTDIR)" \
+	"WERROR=$(WERROR)" \
+        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
+        "TARGET_LIB_PATH_librust=$(TARGET_LIB_PATH_librust)" \
+	"LIBTOOL=$(RUST_BUILDDIR)/libtool"
+
+include $(top_srcdir)/../multilib.am
diff --git a/libgrust/configure.ac b/libgrust/configure.ac
new file mode 100644
index 00000000000..7aed489a643
--- /dev/null
+++ b/libgrust/configure.ac
@@ -0,0 +1,113 @@ 
+AC_INIT([libgrust], version-unused,,librust)
+AC_CONFIG_SRCDIR(Makefile.am)
+AC_CONFIG_FILES([Makefile])
+
+# AM_ENABLE_MULTILIB(, ..)
+
+# Do not delete or change the following two lines.  For why, see
+# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
+AC_CANONICAL_SYSTEM
+target_alias=${target_alias-$host_alias}
+AC_SUBST(target_alias)
+
+# Automake should never attempt to rebuild configure
+AM_MAINTAINER_MODE
+
+AM_INIT_AUTOMAKE([1.15.1 foreign no-dist -Wall])
+
+# Make sure we don't test executables when making cross-tools.
+GCC_NO_EXECUTABLES
+
+
+# Add the ability to change LIBTOOL directory
+GCC_WITH_TOOLEXECLIBDIR
+
+# Use system specific extensions
+AC_USE_SYSTEM_EXTENSIONS
+
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h \
+                 time.h sys/stat.h wchar.h)
+
+# Check for tools
+AM_PROG_AR
+AC_PROG_CC
+AC_PROG_CXX
+AM_PROG_AS
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Enable libtool
+LT_INIT
+
+# target_noncanonical variables...
+AC_CANONICAL_HOST
+ACX_NONCANONICAL_HOST
+ACX_NONCANONICAL_TARGET
+GCC_TOPLEV_SUBDIRS
+
+AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
+AC_ARG_ENABLE(version-specific-runtime-libs,
+[  --enable-version-specific-runtime-libs    Specify that runtime libraries should be installed in a compiler-specific directory ],
+[case "$enableval" in
+ yes) version_specific_libs=yes ;;
+ no)  version_specific_libs=no ;;
+ *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
+ esac],
+[version_specific_libs=no])
+AC_MSG_RESULT($version_specific_libs)
+
+toolexecdir=no
+toolexeclibdir=no
+
+# Calculate toolexeclibdir
+# Also toolexecdir, though it's only used in toolexeclibdir
+case ${version_specific_libs} in
+  yes)
+    # Need the gcc compiler version to know where to install libraries
+    # and header files if --enable-version-specific-runtime-libs option
+    # is selected.
+    toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
+    toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
+    ;;
+  no)
+    if test -n "$with_cross_host" &&
+       test x"$with_cross_host" != x"no"; then
+      # Install a library built with a cross compiler in tooldir, not libdir.
+      toolexecdir='$(exec_prefix)/$(target_noncanonical)'
+      toolexeclibdir='$(toolexecdir)/lib'
+    else
+      toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
+      toolexeclibdir='$(libdir)'
+    fi
+    multi_os_directory=`$CC -print-multi-os-directory`
+    case $multi_os_directory in
+      .) ;; # Avoid trailing /.
+      *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+    esac
+    ;;
+esac
+
+AC_SUBST(toolexecdir)
+AC_SUBST(toolexeclibdir)
+
+
+AC_CONFIG_FILES(AC_FOREACH([DIR], [libproc_macro], [DIR/Makefile ]),
+ [ cat > vpsed$$ << \_EOF
+s!`test -f '$<' || echo '$(srcdir)/'`!!
+_EOF
+   sed -f vpsed$$ $ac_file > tmp$$
+   mv tmp$$ $ac_file
+   rm vpsed$$
+   echo 'MULTISUBDIR =' >> $ac_file
+   ml_norecursion=yes
+   AS_UNSET([ml_norecursion])
+])
+
+
+AC_MSG_NOTICE([librust has been configured.])
+
+AC_OUTPUT
diff --git a/libgrust/libproc_macro/Makefile.am b/libgrust/libproc_macro/Makefile.am
new file mode 100644
index 00000000000..1e61d12e506
--- /dev/null
+++ b/libgrust/libproc_macro/Makefile.am
@@ -0,0 +1,58 @@ 
+SUFFIXES = .cc .o .a .lo .la
+
+ACLOCAL_AMFLAGS = -I .. -I ../../config
+
+toolexeclibdir=@toolexeclibdir@
+toolexecdir=@toolexecdir@
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+	"AR_FLAGS=$(AR_FLAGS)" \
+	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+	"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
+	"CFLAGS=$(CFLAGS)" \
+	"CXXFLAGS=$(CXXFLAGS)" \
+	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+	"INSTALL=$(INSTALL)" \
+	"INSTALL_DATA=$(INSTALL_DATA)" \
+	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+	"LDFLAGS=$(LDFLAGS)" \
+	"LIBCFLAGS=$(LIBCFLAGS)" \
+	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+	"MAKE=$(MAKE)" \
+	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+	"PICFLAG=$(PICFLAG)" \
+	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+	"SHELL=$(SHELL)" \
+	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+	"exec_prefix=$(exec_prefix)" \
+	"infodir=$(infodir)" \
+	"libdir=$(libdir)" \
+	"includedir=$(includedir)" \
+	"prefix=$(prefix)" \
+	"tooldir=$(tooldir)" \
+	"gxx_include_dir=$(gxx_include_dir)" \
+	"AR=$(AR)" \
+	"AS=$(AS)" \
+	"LD=$(LD)" \
+	"RANLIB=$(RANLIB)" \
+	"NM=$(NM)" \
+	"NM_FOR_BUILD=$(NM_FOR_BUILD)" \
+	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
+	"DESTDIR=$(DESTDIR)" \
+	"WERROR=$(WERROR)" \
+        "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \
+        "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)"
+
+toolexeclib_LTLIBRARIES = libproc_macro.la
+
+libproc_macro_la_SOURCES = \
+	proc_macro.cc
+
+include_HEADERS = \
+	proc_macro.h
+
diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc
new file mode 100644
index 00000000000..d13276294aa
--- /dev/null
+++ b/libgrust/libproc_macro/proc_macro.cc
@@ -0,0 +1,7 @@ 
+#include "proc_macro.h"
+
+int
+test ()
+{
+  return 0;
+}
diff --git a/libgrust/libproc_macro/proc_macro.h b/libgrust/libproc_macro/proc_macro.h
new file mode 100644
index 00000000000..2c96b3de685
--- /dev/null
+++ b/libgrust/libproc_macro/proc_macro.h
@@ -0,0 +1,7 @@ 
+#ifndef PROC_MACRO_H
+#define PROC_MACRO_H
+
+int
+test ();
+
+#endif /* ! PROC_MACRO_H */