public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* cross compiling gcc
@ 2010-08-15 16:04 Max S.
  2010-08-17 14:00 ` Ian Lance Taylor
  2010-08-24 12:49 ` Kai Ruottu
  0 siblings, 2 replies; 4+ messages in thread
From: Max S. @ 2010-08-15 16:04 UTC (permalink / raw)
  To: gcc-help

So... I've been for several days now, attempting to build a cross
compiler for an sh4-linux arch from a laptop with
x86_64-unknown-linux-gnu.
Not a Canadian cross or anything that special. just a version of gcc
that runs on my laptop and produces executables for my
hico7760(sh4-linux).

Just to make sure I've understood it right heres what I understand about
building a cross compiler.
step 1) build the binutils
step 2) get linux headers
step 3) build a mini version of gcc
step 4) build the standard libs
step 5) use them to rebuild a full version of gcc

The following details these steps as I took them (as far as I got).

  * First I downloaded(and unpacked) all sources to /home/dev/src
  * that means binutils-2.20,linux-2.6.35,gcc-4.5.1,glibc-2.12.1, and
because I read it was good for embedded devices(and got stuck compiling
glibc) newlib-1.18.0 

  $ pwd
/home/dev/src
  $ laptop=x86_64-unknown-linux-gnu
  $ target=sh4-linux
  $ tc_dir=/home/dev/toolchain

  $ mkdir zbinutils_build
  $ cd zbinutild_build
  $ ../binutils-2.20/configure \
    --prefix=$tc_dir \
    --build=$laptop \
    --host=$laptop \
    --target=$target \
    --disable-nls \
    --disable-multilib \
    --disable-shared

  $ make
  $ make install
  $ PATH=$tc_dir/bin:$PATH
  $ cd ../

  $ cd linux-2.6.35
  $ make ARCH=sh headers_install
  $ cp -a include $tc_dir/$target/include
  $ cd $tc_dir/$target/
  $ ln -s include sys_include
  $ cd /home/dev/src

  $ mkdir zgcc_build
  $ cd zgcc_build
  $ ../gcc-4.5.1/configure \
    --prefix=$tc_dir \
    --build=$laptop \
    --host=$laptop \
    --target=$target \
    --disable-nls \
    --disable-multilib \
    --disable-shared \
    --disable-threads \
    --enable-languages=c
  $ make all-gcc
  $ make install
...
make[3]: Entering directory
`/home/dev/src/zgcc_build/libiberty/testsuite'
make[3]: Nothing to be done for `install'.
make[3]: Leaving directory
`/home/dev/src/zgcc_build/libiberty/testsuite'
make[2]: Leaving directory `/home/dev/src/zgcc_build/libiberty'
/bin/bash: line 3: cd: sh4-linux/libmudflap: No such file or directory
make[1]: *** [install-target-libmudflap] Error 1
make[1]: Leaving directory `/home/dev/src/zgcc_build'
make: *** [install] Error 2

  * can I ignore these errors?
  * I now have a mini gcc located at $tc_dir/bin/${target}-gcc , and
($tc_dir/bin being in my path) is accessible through ${target}-gcc

  $ ${target}-gcc -v
Using built-in specs.
COLLECT_GCC=sh4-linux-gcc
COLLECT_LTO_WRAPPER=/home/dev/toolchain/libexec/gcc/sh4-linux/4.5.1/lto-wrapper
Target: sh4-linux
Configured with: ../gcc-4.5.1/configure --prefix=/home/dev/toolchain
--build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu
--target=sh4-linux --disable-nls --disable-multilib --disable-shared
--disable-threads --enable-languages=c
Thread model: single
gcc version 4.5.1 (GCC)

  * I can not however build the simplest of programs. (libs are
missing... naturally... they have not been compiled)
  * the idea would then be to build glibc

  $ cd ../

  $ cd zglibc_build
  * I decided to configure glibc to install into /home/dev/cross_glibc
so I could examine the results. I would then coppy it wherever manually
later
  * this is also where I am stuck...
  $ ../glibc-2.12.1/configure \
  --prefix=/home/dev/cross_glibc \
  --host=$target \
  --build=$laptop \
  --disable-profile \
  --enable-add-ons \
  --with-tls \
  --enable-kernel=2.6.0 \
  --with-__thread \
  --with-binutils=$tc_dir/bin \
  --with-headers=$tc_dir/$target/include

checking build system type... x86_64-unknown-linux-gnu
checking host system type... sh4-unknown-linux-gnu
checking for sh4-linux-gcc... sh4-linux-gcc
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether sh4-linux-gcc accepts -g... yes
checking for sh4-linux-gcc option to accept ISO C89... unsupported
checking for gcc... gcc
checking how to run the C preprocessor... sh4-linux-gcc -E
checking for sh4-linux-g++... no
checking for sh4-linux-c++... no
checking for sh4-linux-gpp... no
checking for sh4-linux-aCC... no
checking for sh4-linux-CC... no
checking for sh4-linux-cxx... no
checking for sh4-linux-cc++... no
checking for sh4-linux-cl.exe... no
checking for sh4-linux-FCC... no
checking for sh4-linux-KCC... no
checking for sh4-linux-RCC... no
checking for sh4-linux-xlC_r... no
checking for sh4-linux-xlC... no
checking for g++... g++
configure: WARNING: using cross tools not prefixed with host triplet
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
configure: running configure fragment for add-on libidn
configure: running configure fragment for add-on nptl
checking sysdep dirs... checking for assembler gnu_indirect_function
symbol type support... yes
sysdeps/sh/elf nptl/sysdeps/unix/sysv/linux/sh/sh4
sysdeps/unix/sysv/linux/sh/sh4 nptl/sysdeps/unix/sysv/linux/sh
sysdeps/unix/sysv/linux/sh nptl/sysdeps/unix/sysv/linux
nptl/sysdeps/pthread sysdeps/pthread sysdeps/unix/sysv/linux sysdeps/gnu
sysdeps/unix/common sysdeps/unix/mman sysdeps/unix/inet
nptl/sysdeps/unix/sysv sysdeps/unix/sysv sysdeps/unix/sh
nptl/sysdeps/unix sysdeps/unix sysdeps/posix sysdeps/sh/sh4/fpu
sysdeps/sh/sh4 nptl/sysdeps/sh sysdeps/sh sysdeps/wordsize-32
sysdeps/ieee754/flt-32 sysdeps/ieee754/dbl-64 sysdeps/ieee754
sysdeps/generic/elf sysdeps/generic
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln -s works... yes
checking
whether /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/as is GNU as... yes
checking
whether /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/ld is GNU ld... yes
checking
for /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/as... /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/as
checking version
of /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/as... 2.20, ok
checking
for /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/ld... /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/ld
checking version
of /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/ld... 2.20, ok
checking for pwd... /bin/pwd
checking for sh4-linux-gcc... (cached) sh4-linux-gcc
checking version of sh4-linux-gcc... 4.5.1, ok
checking for gnumake... no
checking for gmake... no
checking for make... make
checking version of make... 3.81, ok
checking for gnumsgfmt... no
checking for gmsgfmt... no
checking for msgfmt... msgfmt
checking version of msgfmt... 0.17, ok
checking for makeinfo... makeinfo
checking version of makeinfo... 4.13, ok
checking for sed... sed
checking version of sed... 4.2.1, ok
checking for autoconf... autoconf
checking whether autoconf works... yes
checking whether ranlib is necessary... no
checking LD_LIBRARY_PATH variable... ok
checking whether GCC supports -static-libgcc... -static-libgcc
checking for bash... /bin/bash
checking for gawk... gawk
checking for perl... /usr/bin/perl
checking for install-info... /usr/sbin/install-info
checking for bison... no
checking for signed size_t type... no
checking for libc-friendly stddef.h... yes
checking whether we need to use -P to assemble .S files... no
checking whether .text pseudo-op must be used... yes
checking for assembler global-symbol directive... .globl
checking for .set assembler directive... yes
checking for assembler .type directive prefix... @
checking for assembler gnu_unique_object symbol type... yes
checking for .symver assembler directive... yes
checking for ld --version-script... yes
checking for .previous assembler directive... yes
checking for .protected and .hidden assembler directive... yes
checking whether __attribute__((visibility())) is supported... yes
checking for broken __attribute__((visibility()))... no
checking for broken __attribute__((alias()))... no
checking whether to put _rtld_local into .sdata section... yes
checking for .preinit_array/.init_array/.fini_array support... yes
checking for libunwind-support in compiler... no
checking for -z nodelete option... yes
checking for -z nodlopen option... yes
checking for -z initfirst option... yes
checking for -Bgroup option... yes
checking for libgcc_s suffix... 
checking for --as-needed option... no
checking whether --noexecstack is desirable for .S files... yes
checking for -z combreloc... yes
checking for -z execstack... yes
checking for -fpie... no
checking for --hash-style option... yes
checking for -fno-toplevel-reorder -fno-section-anchors... yes
checking for -fstack-protector... no
checking for -fgnu89-inline... yes
checking whether cc puts quotes around section names... no
checking for assembler .weak directive... yes
checking whether CFI directives are supported... yes
checking for ld --no-whole-archive... yes
checking for gcc -fexceptions... yes
checking for __builtin_expect... no
checking for __builtin_memset... no
checking for redirection of built-in functions... yes
checking for __thread... yes
checking for tls_model attribute... yes
checking for libgd... no
checking for is_selinux_enabled in -lselinux... no
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... no
checking for sys/types.h... no
checking for sys/stat.h... no
checking for stdlib.h... no
checking for string.h... no
checking for memory.h... no
checking for strings.h... no
checking for inttypes.h... no
checking for stdint.h... no
checking for unistd.h... no
checking size of long double... 0
running configure fragment for sysdeps/sh/elf
checking for SH TLS support... yes
running configure fragment for nptl/sysdeps/pthread
checking for forced unwind support... no
configure: error: forced unwind support is required

################################################ config.log

configure:27: checking for forced unwind support
configure:56: sh4-linux-gcc -o conftest -g -O2   conftest.c  >&5
/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/ld: crt1.o: No such file: No such file or directory
collect2: ld returned 1 exit status
configure:63: $? = 1
configure: failed program was:
| /* confdefs.h.  */
| #define PACKAGE_NAME "GNU C Library"
| #define PACKAGE_TARNAME "c-library"
| #define PACKAGE_VERSION "(see version.h)"
| #define PACKAGE_STRING "GNU C Library (see version.h)"
| #define PACKAGE_BUGREPORT "glibc"
| #define HAVE_LIBIDN 1
| #define ASM_GLOBAL_DIRECTIVE .globl
| #define HAVE_ASM_SET_DIRECTIVE 1
| #define ASM_TYPE_DIRECTIVE_PREFIX @
| #define HAVE_ASM_UNIQUE_OBJECT 1
| #define DO_VERSIONING 1
| #define HAVE_ASM_PREVIOUS_DIRECTIVE 1
| #define HAVE_SDATA_SECTION 1
| #define HAVE_Z_COMBRELOC 1
| #define NO_UNDERSCORES 1
| #define HAVE_ASM_WEAK_DIRECTIVE 1
| #define HAVE_ASM_CFI_DIRECTIVES 1
| #define HAVE_BUILTIN_REDIRECTION 1
| #define HAVE___THREAD 1
| #define HAVE_TLS_MODEL_ATTRIBUTE 1
| #define SIZEOF_LONG_DOUBLE 0
| #define HAVE_TLS_SUPPORT 1
| #define PI_STATIC_AND_HIDDEN 1
| /* end confdefs.h.  */
| #include <unwind.h>
| int
| main ()
| {
| 
| struct _Unwind_Exception exc;
| struct _Unwind_Context *context;
| _Unwind_GetCFA (context)
|   ;
|   return 0;
| }
configure:83: result: no
configure:158: error: forced unwind support is required

So the reaon this test fails is not necessarily because forced unwind
support is missing, but because crt1.o is...
I understand its gcc that tells ld where to look, so heres the output of
${target}-gcc -print-search-dirs
  $ ${target}-gcc -print-search-dirs
install: /home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/
programs:
=/home/dev/toolchain/libexec/gcc/sh4-linux/4.5.1/:/home/dev/toolchain/libexec/gcc/sh4-linux/4.5.1/:/home/dev/toolchain/libexec/gcc/sh4-linux/:/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/:/home/dev/toolchain/lib/gcc/sh4-linux/:/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/sh4-linux/4.5.1/:/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/bin/
libraries:
=/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/:/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/lib/sh4-linux/4.5.1/:/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/lib/!m4/:/home/dev/toolchain/lib/gcc/sh4-linux/4.5.1/../../../../sh4-linux/lib/

and indeed none of these dirs include the file "crt1.o"
What do I do now? did I miss something while building gcc?
already mentioned above... gcc never successfully installed.
  /bin/bash: line 3: cd: sh4-linux/libmudflap: No such file or directory

I have not built this. what is this for? does it contain crt1.o?
I hope to get to the bottom of this.

It can't honestly be that hard to build a cross compiler.
I must be doing something or other wrong.

I wait patiently (and thankfully) for your advice.

Thanks,
Max, S.

p.s. I can make available the entire output of the configure logs or
other things you may be interested in... but this email is already very
very long.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: cross compiling gcc
  2010-08-15 16:04 cross compiling gcc Max S.
@ 2010-08-17 14:00 ` Ian Lance Taylor
  2010-08-18  4:30   ` Segher Boessenkool
  2010-08-24 12:49 ` Kai Ruottu
  1 sibling, 1 reply; 4+ messages in thread
From: Ian Lance Taylor @ 2010-08-17 14:00 UTC (permalink / raw)
  To: Max S.; +Cc: gcc-help

"Max S." <king@greatfreeworld.org> writes:

> So... I've been for several days now, attempting to build a cross
> compiler for an sh4-linux arch from a laptop with
> x86_64-unknown-linux-gnu.
> Not a Canadian cross or anything that special. just a version of gcc
> that runs on my laptop and produces executables for my
> hico7760(sh4-linux).

I strongly suggest looking at the scripts at http://crosstool.org/ .
Cross-compiling to GNU/Linux systems is painfully hard.

> Just to make sure I've understood it right heres what I understand about
> building a cross compiler.
> step 1) build the binutils
> step 2) get linux headers
> step 3) build a mini version of gcc
> step 4) build the standard libs
> step 5) use them to rebuild a full version of gcc

Yes.

> So the reaon this test fails is not necessarily because forced unwind
> support is missing, but because crt1.o is...

Interesting problem.  crt1.o actually comes from glibc, so it's no
surprise that gcc can't find it when configuring glibc for the first
time.

I don't know how to fix this except to reach into the glibc
configuration mechanism and tell it to not run this test.  You may be
able to do that by setting the libc_cv_forced_unwind in config.cache.

> It can't honestly be that hard to build a cross compiler.

Yes, I'm afraid it can.

Ian

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: cross compiling gcc
  2010-08-17 14:00 ` Ian Lance Taylor
@ 2010-08-18  4:30   ` Segher Boessenkool
  0 siblings, 0 replies; 4+ messages in thread
From: Segher Boessenkool @ 2010-08-18  4:30 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: Max S., gcc-help

>> So the reaon this test fails is not necessarily because forced unwind
>> support is missing, but because crt1.o is...
>
> Interesting problem.  crt1.o actually comes from glibc, so it's no
> surprise that gcc can't find it when configuring glibc for the first
> time.

See the eglibc build instructions:
http://www.eglibc.org/cgi-bin/viewcvs.cgi/*checkout*/branches/eglibc-2_5/libc/EGLIBC.cross-building

It says:
"Next, there are a few object files needed to link shared libraries,
which we build and install by hand:

    $ mkdir -p $sysroot/usr/lib
    $ make csu/subdir_lib
    $ cp csu/crt1.o csu/crti.o csu/crtn.o $sysroot/usr/lib
"

>> It can't honestly be that hard to build a cross compiler.
>
> Yes, I'm afraid it can.

Indeed.  Those eglibc instructions help a lot; whenever you run into a
problem though, you're on your own.


Segher

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: cross compiling gcc
  2010-08-15 16:04 cross compiling gcc Max S.
  2010-08-17 14:00 ` Ian Lance Taylor
@ 2010-08-24 12:49 ` Kai Ruottu
  1 sibling, 0 replies; 4+ messages in thread
From: Kai Ruottu @ 2010-08-24 12:49 UTC (permalink / raw)
  To: gcc-help

15.8.2010 2:46, Max S. kirjoitti:

> So... I've been for several days now, attempting to build a cross
> compiler for an sh4-linux arch from a laptop with
> x86_64-unknown-linux-gnu.

On May 20 this year I seem to have built 4 cross GCCs, 4.1.2 - 4.4.4,
for the 'sh4-linux-gnu' target in 2 hours...

[root@localhost bin]# ls -l -t gcc-sh4-linux*
-rwxr-xr-x 1 root root 176688 20. touko  12:56 gcc-sh4-linux-gnu-4.4
-rwxr-xr-x 1 root root 169308 20. touko  12:52 gcc-sh4-linux-gnu-4.3
-rwxr-xr-x 1 root root  98216 20. touko  11:04 gcc-sh4-linux-gnu-4.1
-rwxr-xr-x 1 root root 157244 20. touko  10:59 gcc-sh4-linux-gnu-4.2

And my build PC was only with AMD Duron 750 MHz and 512 MB... Quick
enough for a slow old dude like me...

> Not a Canadian cross or anything that special. just a version of gcc
> that runs on my laptop and produces executables for my
> hico7760(sh4-linux).

With this kind of goal you should succeed in less than 15 minutes...

> Just to make sure I've understood it right heres what I understand about
> building a cross compiler.
> step 1) build the binutils
> step 2) get linux headers
> step 3) build a mini version of gcc
> step 4) build the standard libs
> step 5) use them to rebuild a full version of gcc

I call this "Code Red", the movie with Tom Cruise and Demi Moore will
tell the meaning: To put stupid recruits to do totally unnecessary
exercises. And after these the results are so bad that the recruits
will have their ears red from all the shouting they received :)

The "Prerequisites" in the GCC Installation docs :

http://gcc.gnu.org/install/prerequisites.html

will tell that a cross compiler will be made in only one build stage :

----------------- clip -------------------
Tools/packages necessary for building GCC

ISO C90 compiler
     Necessary to bootstrap GCC, although versions of GCC prior to 3.4
     also allow bootstrapping with a traditional (K&R) C compiler.

     To build all languages in a cross-compiler or other configuration
     where 3-stage bootstrap is not performed, you need to start with an
     existing GCC binary (version 2.95 or later) because source code for
     language frontends other than C might use GCC extensions.
----------------- clip -------------------

What is not clear in this?  A native GCC build will usually use a
3-stage bootstrapping but a cross GCC build will need only one
stage..

> The following details these steps as I took them (as far as I got).
>
>    * First I downloaded(and unpacked) all sources to /home/dev/src
>    * that means binutils-2.20,linux-2.6.35,gcc-4.5.1,glibc-2.12.1, and
> because I read it was good for embedded devices(and got stuck compiling
> glibc) newlib-1.18.0
<snip>
>    $ ${target}-gcc -v
> Using built-in specs.
> COLLECT_GCC=sh4-linux-gcc
> COLLECT_LTO_WRAPPER=/home/dev/toolchain/libexec/gcc/sh4-linux/4.5.1/lto-wrapper
> Target: sh4-linux
> Configured with: ../gcc-4.5.1/configure --prefix=/home/dev/toolchain
> --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu
> --target=sh4-linux --disable-nls --disable-multilib --disable-shared
> --disable-threads --enable-languages=c
> Thread model: single
> gcc version 4.5.1 (GCC)
>
>    * I can not however build the simplest of programs. (libs are
> missing... naturally... they have not been compiled)
>    * the idea would then be to build glibc

In a normal case the idea would be to NOT build the target C library!
The target C library of course will be provided by the target system.
"If it ain't broken, don't fix it!"  What is the problem with the
target glibc for your "hico7760(sh4-linux)" system?

> It can't honestly be that hard to build a cross compiler.
> I must be doing something or other wrong.

Can a smith use a pre-made hammer when making a hammer? Can a GCC
builder use a pre-made GCC when making a GCC?  Use pre-made native
binutils, bash, glibc,... in a native GCC build?  Use the pre-made
target glibc in a $sysroot in a cross GCC build?

"Yes, we can!" is my thought and therefore I will always have my
own builds being easy as a pie. With an attitude "No, we are not
allowed to do these things!" one's life will be really hard :(

Someone who would like to try a cross GCC for 'sh4-linux-gnu' "just
for a fun", is expected to use steps like :

1. get the binutils and GCC sources
2. get the glibc and kernel headers for 'sh4-linux-gnu' from some
    Linux/SH4 distro on the net, for instance:
    http://ms-n.org/SH-Linux/fc8-shlinux/RPMS/sh4/
3. unpack the glibc and kernel headers RPMS into the chosen $sysroot
4. configure the binutils and GCC sources using the option
    '--with-sysroot=$sysroot' to point to the base target C library
5. build binutils and GCC as binaries for the $host and targeting
    to the $target and then install them.

With a modern 3 GHz or such PC one could succeed in less than 15
minutes...

After one has a "working" toolchain - it succeeds to compile and
link apps to the $target, in the previous "Fedora Linux 8 for SH4"
- one could think to replace the "temporary" glibc with a self-made
newer glibc. "Just for a fun" with this too... With a fully working
GCC (the prerequisite?) the glibc build should work ok! I remember
that a native build is the expectation in glibc too, not only in
GCC (with "system targets", with "embedded targets" without a
native GCC possibility the default is a cross build).

With some existing "custom" Linux target, having its own installed
glibc runtimes on the target system, one of course MUST use the
"C library for the target" in the crosscompiler too, NEVER replace
it with anything "self-made" !  Neither do this in a native GCC
build!

Or: one can use a different C library from the one on the target
in a crosstoolchain but then one must know what it means and why
one does this... For instance when one wants to produce apps which
should work on Fedora 8 - 12 and newer, one probably uses a glibc
made for Fedora 8 in the crosstoolchain but the main target may be
the newest Fedora 12, but some apps sometimes will be run on 8 - 11
too...

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-08-24 10:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-15 16:04 cross compiling gcc Max S.
2010-08-17 14:00 ` Ian Lance Taylor
2010-08-18  4:30   ` Segher Boessenkool
2010-08-24 12:49 ` Kai Ruottu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).