From: Denys Dmytriyenko <denis@denix.org>
To: afd@ti.com
Cc: Denys Dmytriyenko <denys@konsulko.com>,
Ryan Eatmon <reatmon@ti.com>, Chirag Shilwant <c-shilwant@ti.com>,
meta-arago@lists.yoctoproject.org
Subject: Re: [meta-arago][scarthgap/master][PATCH 4/6] meta-arago-extras: Backport abseil-cpp from meta-oe master
Date: Wed, 22 Jan 2025 18:02:00 -0500 [thread overview]
Message-ID: <20250122230200.GU21836@denix.org> (raw)
In-Reply-To: <20250117002520.627504-5-afd@ti.com>
On Thu, Jan 16, 2025 at 06:25:18PM -0600, Andrew Davis via lists.yoctoproject.org wrote:
> ONNX and ONNX Runtime depend on a very specific version of Abseil that
> is not the version included with meta-oe scarthgap. But it just so
> happens to be the version provided in current meta-oe master.
> Backport this version for our use in scarthgap.
>
> This patch is not needed for meta-arago master branch. If meta-oe
> master at some point moves to a newer incompatible version of
> Abseil we will deal with this dependency in a different way.
Just a note here - there's an effort to improve meta-arago-* layers quality
and eventually seek a Yocto Project Compatible status for them. Adding a
version of a recipe that exists upstream is possible, but requires some extra
attention, especially when it's a newer version and gets preferred by BitBake
automatically. One way to do it is to lower its default preference with
DEFAULT_PREFERENCE = "-1" and then set a corresponding PREFERRED_VERSION in
the distro conf...
> Signed-off-by: Andrew Davis <afd@ti.com>
> ---
> .../0001-absl-always-use-asm-sgidefs.h.patch | 38 +++++++
> ...e-maes-option-from-cross-compilation.patch | 38 +++++++
> ...e-neon-option-from-cross-compilation.patch | 49 +++++++++
> .../abseil-cpp/0004-abseil-ppc-fixes.patch | 103 ++++++++++++++++++
> ...-virtual-dtor-in-the-flags-are-neede.patch | 30 +++++
> .../abseil-cpp/abseil-cpp_20240722.0.bb | 54 +++++++++
> 6 files changed, 312 insertions(+)
> create mode 100644 meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0001-absl-always-use-asm-sgidefs.h.patch
> create mode 100644 meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0002-Remove-maes-option-from-cross-compilation.patch
> create mode 100644 meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0003-Remove-neon-option-from-cross-compilation.patch
> create mode 100644 meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0004-abseil-ppc-fixes.patch
> create mode 100644 meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch
> create mode 100644 meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp_20240722.0.bb
>
> diff --git a/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0001-absl-always-use-asm-sgidefs.h.patch b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0001-absl-always-use-asm-sgidefs.h.patch
> new file mode 100644
> index 00000000..6fecf256
> --- /dev/null
> +++ b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0001-absl-always-use-asm-sgidefs.h.patch
> @@ -0,0 +1,38 @@
> +From 11faa06436fdeb0c9948080a11f9a99d3b5ba16c Mon Sep 17 00:00:00 2001
> +From: Khem Raj <raj.khem@gmail.com>
> +Date: Thu, 9 Apr 2020 13:06:27 -0700
> +Subject: [PATCH] absl: always use <asm/sgidefs.h>
> +
> +Fixes mips/musl build, since sgidefs.h is not present on all C libraries
> +but on linux asm/sgidefs.h is there and contains same definitions, using
> +that makes it portable.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Khem Raj <raj.khem@gmail.com>
> +---
> + absl/base/internal/direct_mmap.h | 6 +-----
> + 1 file changed, 1 insertion(+), 5 deletions(-)
> +
> +diff --git a/absl/base/internal/direct_mmap.h b/absl/base/internal/direct_mmap.h
> +index 1beb2ee4..140b0697 100644
> +--- a/absl/base/internal/direct_mmap.h
> ++++ b/absl/base/internal/direct_mmap.h
> +@@ -41,13 +41,9 @@
> +
> + #ifdef __mips__
> + // Include definitions of the ABI currently in use.
> +-#if defined(__BIONIC__) || !defined(__GLIBC__)
> +-// Android doesn't have sgidefs.h, but does have asm/sgidefs.h, which has the
> ++// bionic/musl C libs don't have sgidefs.h, but do have asm/sgidefs.h, which has the
> + // definitions we need.
> + #include <asm/sgidefs.h>
> +-#else
> +-#include <sgidefs.h>
> +-#endif // __BIONIC__ || !__GLIBC__
> + #endif // __mips__
> +
> + // SYS_mmap and SYS_munmap are not defined in Android.
> +--
> +2.25.1
> +
> diff --git a/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0002-Remove-maes-option-from-cross-compilation.patch b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0002-Remove-maes-option-from-cross-compilation.patch
> new file mode 100644
> index 00000000..d49e860f
> --- /dev/null
> +++ b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0002-Remove-maes-option-from-cross-compilation.patch
> @@ -0,0 +1,38 @@
> +From a573ccd57e713486e7d8e782d6b3b34fde01ff9e Mon Sep 17 00:00:00 2001
> +From: Sinan Kaya <sinan.kaya@microsoft.com>
> +Date: Mon, 3 Feb 2020 03:25:57 +0000
> +Subject: [PATCH] Remove maes option from cross-compilation
> +
> +Upstream-Status: Pending
> +---
> + absl/copts/GENERATED_AbseilCopts.cmake | 4 ----
> + absl/copts/GENERATED_copts.bzl | 4 ----
> + 2 files changed, 8 deletions(-)
> +
> +diff --git a/absl/copts/GENERATED_AbseilCopts.cmake b/absl/copts/GENERATED_AbseilCopts.cmake
> +index da2282fe..5e0e8dfd 100644
> +--- a/absl/copts/GENERATED_AbseilCopts.cmake
> ++++ b/absl/copts/GENERATED_AbseilCopts.cmake
> +@@ -229,7 +229,3 @@ list(APPEND ABSL_RANDOM_HWAES_ARM64_FLAGS
> + list(APPEND ABSL_RANDOM_HWAES_MSVC_X64_FLAGS
> + )
> +
> +-list(APPEND ABSL_RANDOM_HWAES_X64_FLAGS
> +- "-maes"
> +- "-msse4.1"
> +-)
> +diff --git a/absl/copts/GENERATED_copts.bzl b/absl/copts/GENERATED_copts.bzl
> +index b9e0071e..0072008c 100644
> +--- a/absl/copts/GENERATED_copts.bzl
> ++++ b/absl/copts/GENERATED_copts.bzl
> +@@ -230,7 +230,3 @@ ABSL_RANDOM_HWAES_ARM64_FLAGS = [
> + ABSL_RANDOM_HWAES_MSVC_X64_FLAGS = [
> + ]
> +
> +-ABSL_RANDOM_HWAES_X64_FLAGS = [
> +- "-maes",
> +- "-msse4.1",
> +-]
> +--
> +2.25.1
> +
> diff --git a/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0003-Remove-neon-option-from-cross-compilation.patch b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0003-Remove-neon-option-from-cross-compilation.patch
> new file mode 100644
> index 00000000..c82b9e1b
> --- /dev/null
> +++ b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0003-Remove-neon-option-from-cross-compilation.patch
> @@ -0,0 +1,49 @@
> +From 632632508daf8bb3a5800dac937ffc33c6d85973 Mon Sep 17 00:00:00 2001
> +From: Jonas Gorski <jonas.gorski@bisdn.de>
> +Date: Thu, 16 Jun 2022 11:46:31 +0000
> +Subject: [PATCH] Remove neon option from cross compilation
> +
> +Not every arm platform supports neon instructions, so do not enforce
> +them.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Jonas Gorski <jonas.gorski@bisdn.de>
> +---
> + absl/copts/GENERATED_AbseilCopts.cmake | 4 ----
> + absl/copts/GENERATED_copts.bzl | 4 ----
> + 2 files changed, 8 deletions(-)
> +
> +diff --git a/absl/copts/GENERATED_AbseilCopts.cmake b/absl/copts/GENERATED_AbseilCopts.cmake
> +index 5e0e8dfd..57cfc4d3 100644
> +--- a/absl/copts/GENERATED_AbseilCopts.cmake
> ++++ b/absl/copts/GENERATED_AbseilCopts.cmake
> +@@ -218,10 +218,6 @@ list(APPEND ABSL_MSVC_TEST_FLAGS
> + "/DNOMINMAX"
> + )
> +
> +-list(APPEND ABSL_RANDOM_HWAES_ARM32_FLAGS
> +- "-mfpu=neon"
> +-)
> +-
> + list(APPEND ABSL_RANDOM_HWAES_ARM64_FLAGS
> + "-march=armv8-a+crypto"
> + )
> +diff --git a/absl/copts/GENERATED_copts.bzl b/absl/copts/GENERATED_copts.bzl
> +index 0072008c..72840fda 100644
> +--- a/absl/copts/GENERATED_copts.bzl
> ++++ b/absl/copts/GENERATED_copts.bzl
> +@@ -219,10 +219,6 @@ ABSL_MSVC_TEST_FLAGS = [
> + "/DNOMINMAX",
> + ]
> +
> +-ABSL_RANDOM_HWAES_ARM32_FLAGS = [
> +- "-mfpu=neon",
> +-]
> +-
> + ABSL_RANDOM_HWAES_ARM64_FLAGS = [
> + "-march=armv8-a+crypto",
> + ]
> +--
> +2.25.1
> +
> diff --git a/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0004-abseil-ppc-fixes.patch b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0004-abseil-ppc-fixes.patch
> new file mode 100644
> index 00000000..ba0cd669
> --- /dev/null
> +++ b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0004-abseil-ppc-fixes.patch
> @@ -0,0 +1,103 @@
> +From f9607924225ca59fb6c60222e6424b84e6f70029 Mon Sep 17 00:00:00 2001
> +From: Khem Raj <raj.khem@gmail.com>
> +Date: Sat, 21 Sep 2024 20:53:06 +0800
> +Subject: [PATCH] abseil: ppc fixes
> +
> +An all-in-one patch that fixes several issues:
> +
> +1) UnscaledCycleClock not fully implemented for ppc*-musl (disabled on musl)
> +2) powerpc stacktrace implementation only works on glibc (disabled on musl)
> +3) powerpc stacktrace implementation has ppc64 assumptions (fixed)
> +4) examine_stack.cpp makes glibc assumptions on powerpc (fixed)
> +
> +Sourced from void linux
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Khem Raj <raj.khem@gmail.com>
> +---
> + absl/base/internal/unscaledcycleclock.cc | 4 ++--
> + absl/base/internal/unscaledcycleclock_config.h | 3 ++-
> + absl/debugging/internal/examine_stack.cc | 8 +++++++-
> + absl/debugging/internal/stacktrace_config.h | 2 +-
> + 4 files changed, 12 insertions(+), 5 deletions(-)
> +
> +diff --git a/absl/base/internal/unscaledcycleclock.cc b/absl/base/internal/unscaledcycleclock.cc
> +index a0bf3a65..103b4f6a 100644
> +--- a/absl/base/internal/unscaledcycleclock.cc
> ++++ b/absl/base/internal/unscaledcycleclock.cc
> +@@ -20,7 +20,7 @@
> + #include <intrin.h>
> + #endif
> +
> +-#if defined(__powerpc__) || defined(__ppc__)
> ++#if (defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)
> + #ifdef __GLIBC__
> + #include <sys/platform/ppc.h>
> + #elif defined(__FreeBSD__)
> +@@ -58,7 +58,7 @@ double UnscaledCycleClock::Frequency() {
> + return base_internal::NominalCPUFrequency();
> + }
> +
> +-#elif defined(__powerpc__) || defined(__ppc__)
> ++#elif (defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)
> +
> + int64_t UnscaledCycleClock::Now() {
> + #ifdef __GLIBC__
> +diff --git a/absl/base/internal/unscaledcycleclock_config.h b/absl/base/internal/unscaledcycleclock_config.h
> +index 43a3dabe..196a8535 100644
> +--- a/absl/base/internal/unscaledcycleclock_config.h
> ++++ b/absl/base/internal/unscaledcycleclock_config.h
> +@@ -21,7 +21,8 @@
> +
> + // The following platforms have an implementation of a hardware counter.
> + #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
> +- defined(__powerpc__) || defined(__ppc__) || defined(_M_IX86) || \
> ++ ((defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)) || \
> ++ defined(_M_IX86) || \
> + (defined(_M_X64) && !defined(_M_ARM64EC))
> + #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
> + #else
> +diff --git a/absl/debugging/internal/examine_stack.cc b/absl/debugging/internal/examine_stack.cc
> +index 3dd6ba1a..f923b055 100644
> +--- a/absl/debugging/internal/examine_stack.cc
> ++++ b/absl/debugging/internal/examine_stack.cc
> +@@ -36,6 +36,10 @@
> + #include <csignal>
> + #include <cstdio>
> +
> ++#if defined(__powerpc__)
> ++#include <asm/ptrace.h>
> ++#endif
> ++
> + #include "absl/base/attributes.h"
> + #include "absl/base/internal/raw_logging.h"
> + #include "absl/base/macros.h"
> +@@ -177,8 +181,10 @@ void* GetProgramCounter(void* const vuc) {
> + return reinterpret_cast<void*>(context->uc_mcontext.pc);
> + #elif defined(__powerpc64__)
> + return reinterpret_cast<void*>(context->uc_mcontext.gp_regs[32]);
> +-#elif defined(__powerpc__)
> ++#elif defined(__powerpc__) && defined(__GLIBC__)
> + return reinterpret_cast<void*>(context->uc_mcontext.uc_regs->gregs[32]);
> ++#elif defined(__powerpc__)
> ++ return reinterpret_cast<void*>((context->uc_regs)->gregs[32]);
> + #elif defined(__riscv)
> + return reinterpret_cast<void*>(context->uc_mcontext.__gregs[REG_PC]);
> + #elif defined(__s390__) && !defined(__s390x__)
> +diff --git a/absl/debugging/internal/stacktrace_config.h b/absl/debugging/internal/stacktrace_config.h
> +index 3929b1b7..23d5e504 100644
> +--- a/absl/debugging/internal/stacktrace_config.h
> ++++ b/absl/debugging/internal/stacktrace_config.h
> +@@ -60,7 +60,7 @@
> + #elif defined(__i386__) || defined(__x86_64__)
> + #define ABSL_STACKTRACE_INL_HEADER \
> + "absl/debugging/internal/stacktrace_x86-inl.inc"
> +-#elif defined(__ppc__) || defined(__PPC__)
> ++#elif (defined(__ppc__) || defined(__PPC__)) && defined(__GLIBC__)
> + #define ABSL_STACKTRACE_INL_HEADER \
> + "absl/debugging/internal/stacktrace_powerpc-inl.inc"
> + #elif defined(__aarch64__)
> +--
> +2.25.1
> +
> diff --git a/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch
> new file mode 100644
> index 00000000..9a4fc0b4
> --- /dev/null
> +++ b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp/0005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch
> @@ -0,0 +1,30 @@
> +From 9cb5e5d15c142e5cc43a2c1db87c8e4e5b6d38a5 Mon Sep 17 00:00:00 2001
> +From: Derek Mauro <dmauro@google.com>
> +Date: Mon, 5 Aug 2024 07:35:05 -0700
> +Subject: [PATCH] Don't match -Wnon-virtual-dtor in the "flags are needed to
> + suppress warnings in headers". It should fall through to the "don't impose
> + our warnings on others" case. Do this by matching on "-Wno-*" instead of
> + "-Wno*".
> +
> +Fixes #1737
> +
> +PiperOrigin-RevId: 659548798
> +Change-Id: I49d7ba7ddcd7be30f946fca90ba9be467181e854
> +Upstream-Status: Backport [https://github.com/abseil/abseil-cpp/commit/9cb5e5d15c142e5cc43a2c1db87c8e4e5b6d38a5]
> +---
> + CMake/AbseilHelpers.cmake | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake
> +index b177e590..3c4c92fe 100644
> +--- a/CMake/AbseilHelpers.cmake
> ++++ b/CMake/AbseilHelpers.cmake
> +@@ -195,7 +195,7 @@ function(absl_cc_library)
> + # specified platform. Filter both of them out before the successor
> + # reaches the "^-m" filter.
> + set(skip_next_cflag ON)
> +- elseif(${cflag} MATCHES "^(-Wno|/wd)")
> ++ elseif(${cflag} MATCHES "^(-Wno-|/wd)")
> + # These flags are needed to suppress warnings that might fire in our headers.
> + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}")
> + elseif(${cflag} MATCHES "^(-W|/w[1234eo])")
> diff --git a/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp_20240722.0.bb b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp_20240722.0.bb
> new file mode 100644
> index 00000000..4bfc2100
> --- /dev/null
> +++ b/meta-arago-extras/recipes-devtools/abseil-cpp/abseil-cpp_20240722.0.bb
> @@ -0,0 +1,54 @@
> +SUMMARY = "Abseil is a cpp library like STL"
> +DESCRIPTION = "Abseil provides pieces missing from the C++ standard. Contains \
> +additional useful libraries like algorithm, container, debugging, hash, memory, \
> +meta, numeric, strings, synchronization, time, types and utility."
> +HOMEPAGE = "https://abseil.io/"
> +SECTION = "libs"
> +LICENSE = "Apache-2.0"
> +LIC_FILES_CHKSUM = "file://LICENSE;md5=df52c6edb7adc22e533b2bacc3bd3915"
> +
> +SRCREV = "4447c7562e3bc702ade25105912dce503f0c4010"
> +BRANCH = "lts_2024_07_22"
> +SRC_URI = "git://github.com/abseil/abseil-cpp;branch=${BRANCH};protocol=https \
> + file://0001-absl-always-use-asm-sgidefs.h.patch \
> + file://0002-Remove-maes-option-from-cross-compilation.patch \
> + file://0003-Remove-neon-option-from-cross-compilation.patch \
> + file://0004-abseil-ppc-fixes.patch \
> + file://0005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch \
> + "
> +
> +S = "${WORKDIR}/git"
> +
> +inherit cmake
> +
> +EXTRA_OECMAKE = "-DBUILD_SHARED_LIBS=ON \
> + -DBUILD_TESTING=OFF \
> + -DABSL_ENABLE_INSTALL=ON \
> + "
> +
> +SYSROOT_DIRS:append:class-nativesdk:mingw32 = " ${bindir}"
> +
> +PACKAGES_DYNAMIC += "^libabsl-*"
> +PACKAGES_DYNAMIC:class-native = ""
> +
> +PACKAGESPLITFUNCS =+ "split_dynamic_packages"
> +
> +python split_dynamic_packages() {
> + libdir = d.getVar('libdir')
> +
> + libpackages = do_split_packages(
> + d,
> + root=libdir,
> + file_regex=r'^libabsl_(.*)\.so\..*$',
> + output_pattern='libabsl-%s',
> + description="abseil shared library %s",
> + prepend=True,
> + extra_depends='',
> + )
> + if libpackages:
> + d.appendVar('RDEPENDS:' + d.getVar('PN'), ' ' + ' '.join(libpackages))
> +}
> +
> +ALLOW_EMPTY:${PN} = "1"
> +
> +BBCLASSEXTEND = "native nativesdk"
> --
> 2.39.2
next prev parent reply other threads:[~2025-01-22 23:02 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-17 0:25 [meta-arago][scarthgap/master][PATCH 0/6] Add ONNX Runtime Andrew Davis
2025-01-17 0:25 ` [meta-arago][scarthgap/master][PATCH 1/6] flatbuffers: Remove this recipe Andrew Davis
2025-01-17 0:25 ` [meta-arago][scarthgap/master][PATCH 2/6] meta-arago-extras: Add recipe for arm-compute-library Andrew Davis
2025-01-17 0:25 ` [meta-arago][scarthgap/master][PATCH 3/6] meta-arago-extras: Add recipe for Arm NN Andrew Davis
2025-01-17 0:25 ` [meta-arago][scarthgap/master][PATCH 4/6] meta-arago-extras: Backport abseil-cpp from meta-oe master Andrew Davis
2025-01-22 23:02 ` Denys Dmytriyenko [this message]
2025-01-23 15:49 ` Andrew Davis
2025-01-23 15:56 ` Ryan Eatmon
2025-01-23 16:28 ` Andrew Davis
2025-01-17 0:25 ` [meta-arago][scarthgap/master][PATCH 5/6] meta-arago-extras: Add recipe for ONNX Andrew Davis
2025-01-18 19:48 ` Chirag Shilwant
2025-01-21 18:59 ` Andrew Davis
2025-01-21 19:25 ` Denys Dmytriyenko
2025-01-22 16:30 ` Ryan Eatmon
2025-01-24 21:14 ` Andrew Davis
2025-01-17 0:25 ` [meta-arago][scarthgap/master][PATCH 6/6] meta-arago-extras: Add recipe for ONNX Runtime Andrew Davis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250122230200.GU21836@denix.org \
--to=denis@denix.org \
--cc=afd@ti.com \
--cc=c-shilwant@ti.com \
--cc=denys@konsulko.com \
--cc=meta-arago@lists.yoctoproject.org \
--cc=reatmon@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.