PING^2: [PATCH] Add --enable-first-stage-cross configure option
Commit Message
Ping: [PATCH] Add --enable-first-stage-cross configure option
https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575318.html
Add --enable-first-stage-cross configure option
Build static-only, C-only compiler that is sufficient to cross compile
glibc. This option disables various runtime libraries that require
libc to compile, turns on --with-newlib, --without-headers,
--disable-decimal-float, --disable-shared, --disable-threads, and sets
--enable-languages=c.
Rationale: current way of building first stage compiler of a cross
toolchain requires specifying a list of target libraries that are not
going to be compiled due to their dependency on target libc. This
list is not documented in gccinstall.texi and sometimes changes. To
simplify the procedure, it is better to maintain that list in the GCC
itself.
Usage example as a patch to glibc's scripts/build-many-libcs.py:
Comments
On 10/01/22 00:26 +0300, Serge Belyshev wrote:
>Ping: [PATCH] Add --enable-first-stage-cross configure option
>https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575318.html
>
>
>Add --enable-first-stage-cross configure option
>
>Build static-only, C-only compiler that is sufficient to cross compile
>glibc. This option disables various runtime libraries that require
>libc to compile, turns on --with-newlib, --without-headers,
>--disable-decimal-float, --disable-shared, --disable-threads, and sets
>--enable-languages=c.
>Rationale: current way of building first stage compiler of a cross
>toolchain requires specifying a list of target libraries that are not
>going to be compiled due to their dependency on target libc. This
>list is not documented in gccinstall.texi and sometimes changes. To
>simplify the procedure, it is better to maintain that list in the GCC
>itself.
I think this is a great idea.
I don't think it makes any difference to this patch, but I've just
committed a change to libstdc++ so that you no longer neeed to add
--with-newlib when libstdc++ is configured with --without-headers
(because it's counter-intuitive to have to say which libc you're using
when not using any libc).
I only tested it for --disable-hosted-libstdcxx --without-headers
because I am not sure what libstdc++ even does if you build it hosted
but --without-headers.
Final ping before stage3 ends:
[PATCH] Add --enable-first-stage-cross configure option
https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575318.html
On 1/9/2022 2:26 PM, Serge Belyshev wrote:
> Ping: [PATCH] Add --enable-first-stage-cross configure option
> https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575318.html
>
>
> Add --enable-first-stage-cross configure option
>
> Build static-only, C-only compiler that is sufficient to cross compile
> glibc. This option disables various runtime libraries that require
> libc to compile, turns on --with-newlib, --without-headers,
> --disable-decimal-float, --disable-shared, --disable-threads, and sets
> --enable-languages=c.
>
> Rationale: current way of building first stage compiler of a cross
> toolchain requires specifying a list of target libraries that are not
> going to be compiled due to their dependency on target libc. This
> list is not documented in gccinstall.texi and sometimes changes. To
> simplify the procedure, it is better to maintain that list in the GCC
> itself.
>
> Usage example as a patch to glibc's scripts/build-many-libcs.py:
>
> diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py
> index 580d25e8ee..3a6a7be76b 100755
> --- a/scripts/build-many-glibcs.py
> +++ b/scripts/build-many-glibcs.py
> @@ -1446,17 +1446,7 @@ class Config(object):
> # required to define inhibit_libc (to stop some parts of
> # libgcc including libc headers); --without-headers is not
> # sufficient.
> - cfg_opts += ['--enable-languages=c', '--disable-shared',
> - '--disable-threads',
> - '--disable-libatomic',
> - '--disable-decimal-float',
> - '--disable-libffi',
> - '--disable-libgomp',
> - '--disable-libitm',
> - '--disable-libmpx',
> - '--disable-libquadmath',
> - '--disable-libsanitizer',
> - '--without-headers', '--with-newlib',
> + cfg_opts += ['--enable-first-stage-cross',
> '--with-glibc-version=%s' % self.ctx.glibc_version
> ]
> cfg_opts += self.first_gcc_cfg
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, and
> tested with build-many-glibcs.py with the above patch.
>
> OK for mainline?
>
>
> ChangeLog:
>
> * configure.ac: Add --enable-first-stage-cross.
> * configure: Regenerate.
>
> gcc/ChangeLog:
>
> * doc/install.texi: Document --enable-first-stage-cross.
I'm not really sure we need a patch for this. Isn't it sufficient to
"make all-gcc && make all-target-libgcc"? Folks have been doing that
for decades.
Jeff
Jeff Law via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> I'm not really sure we need a patch for this. Isn't it sufficient to
> "make all-gcc && make all-target-libgcc"? Folks have been doing that
> for decades.
>
> Jeff
Oh, I did not know that "make install-gcc install-target-libgcc" works in this case.
So in the end, patch simplifies quirky first stage cross tool build procedure from
configure --target=$target --enable-languages=c --disable-threads --disable-shared # plus --with-newlib when --with-sysroot=
make all-gcc all-target-libgcc
make install-gcc install-target-libgcc
to
configure --target=$target --enable-first-stage-cross
make
make install
Either way is more or less okay for me, it just needs to be documented.
@@ -1446,17 +1446,7 @@ class Config(object):
# required to define inhibit_libc (to stop some parts of
# libgcc including libc headers); --without-headers is not
# sufficient.
- cfg_opts += ['--enable-languages=c', '--disable-shared',
- '--disable-threads',
- '--disable-libatomic',
- '--disable-decimal-float',
- '--disable-libffi',
- '--disable-libgomp',
- '--disable-libitm',
- '--disable-libmpx',
- '--disable-libquadmath',
- '--disable-libsanitizer',
- '--without-headers', '--with-newlib',
+ cfg_opts += ['--enable-first-stage-cross',
'--with-glibc-version=%s' % self.ctx.glibc_version
]
cfg_opts += self.first_gcc_cfg
Bootstrapped/regtested on x86_64-pc-linux-gnu, and
tested with build-many-glibcs.py with the above patch.
OK for mainline?
ChangeLog:
* configure.ac: Add --enable-first-stage-cross.
* configure: Regenerate.
gcc/ChangeLog:
* doc/install.texi: Document --enable-first-stage-cross.
---
configure | 20 ++++++++++++++++++++
configure.ac | 15 +++++++++++++++
gcc/doc/install.texi | 7 +++++++
3 files changed, 42 insertions(+)
@@ -794,6 +794,7 @@ ac_user_opts='
enable_option_checking
with_build_libsubdir
with_system_zlib
+enable_first_stage_cross
enable_as_accelerator_for
enable_offload_targets
enable_offload_defaulted
@@ -1522,6 +1523,9 @@ 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-first-stage-cross
+ Build a static-only compiler that is sufficient to
+ build glibc.
--enable-as-accelerator-for=ARG
build as offload target compiler. Specify offload
host triple by ARG
@@ -2971,6 +2975,22 @@ case $is_cross_compiler in
no) skipdirs="${skipdirs} ${cross_only}" ;;
esac
+# Check whether --enable-first-stage-cross was given.
+if test "${enable_first_stage_cross+set}" = set; then :
+ enableval=$enable_first_stage_cross; ENABLE_FIRST_STAGE_CROSS=$enableval
+else
+ ENABLE_FIRST_STAGE_CROSS=no
+fi
+
+case "${ENABLE_FIRST_STAGE_CROSS}" in
+ yes)
+ noconfigdirs="$noconfigdirs target-libatomic target-libquadmath target-libgomp target-libssp"
+ host_configargs="$host_configargs --disable-shared --disable-threads --disable-decimal-float --without-headers --with-newlib"
+ target_configargs="$target_configargs --disable-shared"
+ enable_languages=c
+ ;;
+esac
+
# If both --with-headers and --with-libs are specified, default to
# --without-newlib.
if test x"${with_headers}" != x && test x"${with_headers}" != xno \
@@ -268,6 +268,21 @@ case $is_cross_compiler in
no) skipdirs="${skipdirs} ${cross_only}" ;;
esac
+AC_ARG_ENABLE(first-stage-cross,
+[AS_HELP_STRING([--enable-first-stage-cross],
+ [Build a static-only compiler that is
+ sufficient to build glibc.])],
+ENABLE_FIRST_STAGE_CROSS=$enableval,
+ENABLE_FIRST_STAGE_CROSS=no)
+case "${ENABLE_FIRST_STAGE_CROSS}" in
+ yes)
+ noconfigdirs="$noconfigdirs target-libatomic target-libquadmath target-libgomp target-libssp"
+ host_configargs="$host_configargs --disable-shared --disable-threads --disable-decimal-float --without-headers --with-newlib"
+ target_configargs="$target_configargs --disable-shared"
+ enable_languages=c
+ ;;
+esac
+
# If both --with-headers and --with-libs are specified, default to
# --without-newlib.
if test x"${with_headers}" != x && test x"${with_headers}" != xno \
@@ -2529,6 +2529,13 @@ When you use this option, you should ensure that @var{dir} includes
@command{ranlib} and @command{strip} if necessary, and possibly
@command{objdump}. Otherwise, GCC may use an inconsistent set of
tools.
+
+@item --enable-first-stage-cross
+Build static-only, C-only compiler that is sufficient to cross compile glibc.
+This option disables various runtime libraries that require libc to compile,
+turns on @option{--with-newlib}, @option{--without-headers},
+@option{--disable-decimal-float}, @option{--disable-shared},
+@option{--disable-threads} and sets @option{--enable-languages=c}.
@end table
@subsubheading Overriding @command{configure} test results