From: "Miroslav Šulc" <fordfrog@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: media-libs/raspberrypi-userland/files/, media-libs/raspberrypi-userland/
Date: Thu, 10 Mar 2016 14:04:56 +0000 (UTC) [thread overview]
Message-ID: <1457618683.06c415c57f1452d3376499ff82128d9b7013f64a.fordfrog@gentoo> (raw)
commit: 06c415c57f1452d3376499ff82128d9b7013f64a
Author: Miroslav Šulc <fordfrog <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 10 14:04:43 2016 +0000
Commit: Miroslav Šulc <fordfrog <AT> gentoo <DOT> org>
CommitDate: Thu Mar 10 14:04:43 2016 +0000
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=06c415c5
media-libs/raspberrypi-userland: bug fixes and improvements
fixed bug #539504: support for GLESv1
fixed bugs #499768 and #529424: added pkgconfig files and set environment path to these files
fixed location of udev rules file
fixed bug #499768: added support for wayland from leio.git overlay
Package-Manager: portage-2.2.27
.../files/04raspberrypi-userland | 2 +-
media-libs/raspberrypi-userland/files/bcm_host.pc | 10 +
media-libs/raspberrypi-userland/files/egl.pc | 11 ++
media-libs/raspberrypi-userland/files/glesv2.pc | 11 ++
.../files/next-resource-handle.patch | 207 +++++++++++++++++++++
.../raspberrypi-userland/files/wayland-wsys.patch | 0
...> raspberrypi-userland-0_pre20160305-r1.ebuild} | 27 ++-
7 files changed, 264 insertions(+), 4 deletions(-)
diff --git a/media-libs/raspberrypi-userland/files/04raspberrypi-userland b/media-libs/raspberrypi-userland/files/04raspberrypi-userland
index fd37f49..17b493b 100644
--- a/media-libs/raspberrypi-userland/files/04raspberrypi-userland
+++ b/media-libs/raspberrypi-userland/files/04raspberrypi-userland
@@ -1,3 +1,3 @@
-
+PKG_CONFIG_PATH='/opt/vc/lib/pkgconfig'
PATH='/opt/vc/bin'
LDPATH='/opt/vc/lib'
diff --git a/media-libs/raspberrypi-userland/files/bcm_host.pc b/media-libs/raspberrypi-userland/files/bcm_host.pc
new file mode 100644
index 0000000..7627ae8
--- /dev/null
+++ b/media-libs/raspberrypi-userland/files/bcm_host.pc
@@ -0,0 +1,10 @@
+prefix=/opt/vc
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: bcm_host
+Description: Broadcom VideoCore host API library
+Version: 1
+Libs: -L${libdir} -lbcm_host -lvcos -lvchiq_arm
+Cflags: -I${includedir} -I${includedir}/interface/vmcs_host/linux -I${includedir}/interface/vcos/pthreads -DUSE_VCHIQ_ARM
diff --git a/media-libs/raspberrypi-userland/files/egl.pc b/media-libs/raspberrypi-userland/files/egl.pc
new file mode 100644
index 0000000..56bf1e0
--- /dev/null
+++ b/media-libs/raspberrypi-userland/files/egl.pc
@@ -0,0 +1,11 @@
+prefix=/opt/vc
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: EGL
+Description: Fake EGL package for RPi
+Version: 10
+Requires: bcm_host glesv2
+Libs: -L${libdir} -lEGL
+Cflags: -I${includedir}
diff --git a/media-libs/raspberrypi-userland/files/glesv2.pc b/media-libs/raspberrypi-userland/files/glesv2.pc
new file mode 100644
index 0000000..04d61c2
--- /dev/null
+++ b/media-libs/raspberrypi-userland/files/glesv2.pc
@@ -0,0 +1,11 @@
+prefix=/opt/vc
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: GLESv2
+Description: Fake GL ES 2 package for RPi
+Version: 10
+Requires: bcm_host
+Libs: -L${libdir} -lGLESv2
+Cflags: -I${includedir}
diff --git a/media-libs/raspberrypi-userland/files/next-resource-handle.patch b/media-libs/raspberrypi-userland/files/next-resource-handle.patch
new file mode 100644
index 0000000..45e1a49
--- /dev/null
+++ b/media-libs/raspberrypi-userland/files/next-resource-handle.patch
@@ -0,0 +1,207 @@
+From 825c3236e5908ff003644abd870bfe98e82722b2 Mon Sep 17 00:00:00 2001
+From: Dom Cobley <dc4@broadcom.com>
+Date: Tue, 9 Jul 2013 09:26:26 -0400
+Subject: [PATCH] Allow applications to set next resource handle
+
+This patch adds provisions in userland to
+let apps callers set the next rendereing dispmanx resource.
+It's useful for implementing, say, a buffer carousel.
+---
+ interface/khronos/common/khrn_client_rpc.h | 2 ++
+ interface/khronos/common/khrn_int_ids.h | 2 ++
+ interface/khronos/egl/egl_client.c | 30 +++++++++++++++++++++++++++---
+ interface/khronos/egl/egl_client_surface.c | 24 +++++++++++++++++++++++-
+ interface/khronos/egl/egl_client_surface.h | 3 ++-
+ interface/khronos/egl/egl_int_impl.h | 5 +++--
+ 6 files changed, 59 insertions(+), 7 deletions(-)
+
+diff --git a/interface/khronos/common/khrn_client_rpc.h b/interface/khronos/common/khrn_client_rpc.h
+index 418aa67..a7557a8 100644
+--- a/interface/khronos/common/khrn_client_rpc.h
++++ b/interface/khronos/common/khrn_client_rpc.h
+@@ -683,6 +683,7 @@ static INLINE void rpc_call18(CLIENT_THREAD_STATE_T *thread, uint32_t id, uint32
+ static INLINE void rpc_call13_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); }
+ static INLINE void rpc_call14_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); }
+ static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); }
++static INLINE void rpc_call16_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, uint32_t p14, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); }
+ #endif
+
+ #define RPC_CALL1_OUT_CTRL(fn, thread, id, out) rpc_call1_out_ctrl(thread, id, out)
+@@ -700,6 +701,7 @@ static INLINE void rpc_call18(CLIENT_THREAD_STATE_T *thread, uint32_t id, uint32
+ #define RPC_CALL13_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) rpc_call13_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out)
+ #define RPC_CALL14_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) rpc_call14_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out)
+ #define RPC_CALL15_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) rpc_call15_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out)
++#define RPC_CALL16_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) rpc_call16_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out)
+
+ # if !defined(__SYMBIAN32__) //use functions defined in khrpc.cpp
+ static INLINE uint32_t rpc_call1_out_ctrl_res(CLIENT_THREAD_STATE_T *thread,uint32_t id, void *out) { uint32_t res; rpc_begin(thread); RPC_CALL(thread, id); res = rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_RES | RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); return res; }
+diff --git a/interface/khronos/common/khrn_int_ids.h b/interface/khronos/common/khrn_int_ids.h
+index 8378f4a..ec961e0 100644
+--- a/interface/khronos/common/khrn_int_ids.h
++++ b/interface/khronos/common/khrn_int_ids.h
+@@ -367,6 +367,7 @@
+ */
+
+ #define EGLINTCREATESURFACE_ID 0x4000
++#define EGLINTCREATESURFACE_ID_V2 0x4100
+ #define EGLINTCREATEGLES11_ID 0x4001
+ #define EGLINTCREATEGLES20_ID 0x4002
+ #define EGLINTCREATEVG_ID 0x4003
+@@ -377,6 +378,7 @@
+ #define EGLINTMAKECURRENT_ID 0x4008
+ #define EGLINTFLUSHANDWAIT_ID 0x4009
+ #define EGLINTSWAPBUFFERS_ID 0x400a
++#define EGLINTSWAPBUFFERS_ID_V2 0x410a
+ #define EGLINTSELECTMIPMAP_ID 0x400b
+ #define EGLINTFLUSH_ID 0x400c
+ #define EGLINTGETCOLORDATA_ID 0x400d
+diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c
+index fd07eb6..e902d19 100644
+--- a/interface/khronos/egl/egl_client.c
++++ b/interface/khronos/egl/egl_client.c
+@@ -162,6 +162,17 @@
+ void egl_gl_flush_callback(bool wait);
+ void egl_vg_flush_callback(bool wait);
+
++#include "interface/vmcs_host/vc_dispmanx_types.h"
++/**HACKHACK - give us the ability to inject a DispmanX
++ * resource handle into the CreateWindowSurface and
++ * SwapBuffers calls */
++static DISPMANX_RESOURCE_HANDLE_T next_resource_handle;
++
++EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle)
++{
++ next_resource_handle = handle;
++}
++
+ /*
+ TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate)
+ Also affects global image (and possibly others?)
+@@ -643,7 +654,8 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig c
+ false,
+ EGL_NO_TEXTURE,
+ EGL_NO_TEXTURE,
+- 0, 0);
++ 0, 0,
++ next_resource_handle);
+
+ if (surface) {
+ if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) {
+@@ -888,7 +900,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig
+ mipmap_texture,
+ texture_format,
+ texture_target,
+- 0, 0);
++ 0, 0, 0);
+
+ if (surface) {
+ if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) {
+@@ -1030,7 +1042,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig c
+ false,
+ EGL_NO_TEXTURE,
+ EGL_NO_TEXTURE,
+- pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle);
++ pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0);
+
+ if (surface) {
+ if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) {
+@@ -2302,6 +2314,18 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf)
+
+ vcos_log_trace("eglSwapBuffers server call");
+
++ if (next_resource_handle)
++ RPC_CALL7(eglIntSwapBuffers_impl,
++ thread,
++ EGLINTSWAPBUFFERS_ID_V2,
++ RPC_UINT(surface->serverbuffer),
++ RPC_UINT(surface->width),
++ RPC_UINT(surface->height),
++ RPC_UINT(surface->internal_handle),
++ RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0),
++ RPC_UINT(khrn_platform_get_window_position(surface->win)),
++ RPC_INT(next_resource_handle));
++ else
+ RPC_CALL6(eglIntSwapBuffers_impl,
+ thread,
+ EGLINTSWAPBUFFERS_ID,
+diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c
+index cda5943..0be56c5 100644
+--- a/interface/khronos/egl/egl_client_surface.c
++++ b/interface/khronos/egl/egl_client_surface.c
+@@ -314,7 +314,8 @@ EGL_SURFACE_T *egl_surface_create(
+ EGLenum texture_format,
+ EGLenum texture_target,
+ EGLNativePixmapType pixmap,
+- const uint32_t *pixmap_server_handle)
++ const uint32_t *pixmap_server_handle,
++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle)
+ {
+ KHRN_IMAGE_FORMAT_T color;
+ KHRN_IMAGE_FORMAT_T depth;
+@@ -473,6 +474,27 @@ EGL_SURFACE_T *egl_surface_create(
+ #endif
+ uint32_t results[3];
+
++ if (next_resource_handle)
++ RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl,
++ thread,
++ EGLINTCREATESURFACE_ID_V2,
++ RPC_UINT(serverwin),
++ RPC_UINT(buffers),
++ RPC_UINT(width),
++ RPC_UINT(height),
++ RPC_UINT(color),
++ RPC_UINT(depth),
++ RPC_UINT(mask),
++ RPC_UINT(multi),
++ RPC_UINT(largest_pbuffer),
++ RPC_UINT(mipmap_texture),
++ RPC_UINT(config_depth_bits),
++ RPC_UINT(config_stencil_bits),
++ RPC_UINT(sem_name),
++ RPC_UINT(type),
++ RPC_INT(next_resource_handle),
++ results);
++ else
+ RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl,
+ thread,
+ EGLINTCREATESURFACE_ID,
+diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h
+index c99d44c..b5bf70a 100644
+--- a/interface/khronos/egl/egl_client_surface.h
++++ b/interface/khronos/egl/egl_client_surface.h
+@@ -322,7 +322,8 @@ extern EGL_SURFACE_T *egl_surface_create(
+ EGLenum texture_format,
+ EGLenum texture_target,
+ EGLNativePixmapType pixmap,
+- const uint32_t *pixmap_server_handle);
++ const uint32_t *pixmap_server_handle,
++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle);
+ extern EGL_SURFACE_T *egl_surface_from_vg_image(
+ VGImage vg_handle,
+ EGLSurface name,
+diff --git a/interface/khronos/egl/egl_int_impl.h b/interface/khronos/egl/egl_int_impl.h
+index 8a5734c..51b3580 100644
+--- a/interface/khronos/egl/egl_int_impl.h
++++ b/interface/khronos/egl/egl_int_impl.h
+@@ -56,7 +56,8 @@
+ uint32_t config_stencil_bits,
+ uint32_t sem,
+ uint32_t type,
+- uint32_t *results))
++ uint32_t *results,
++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle))
+
+ FN(int, eglIntCreatePbufferFromVGImage_impl, (
+ VGImage vg_handle,
+@@ -110,7 +111,7 @@
+ FN(int, eglIntFlushAndWait_impl, (uint32_t flushgl, uint32_t flushvg))
+ FN(void, eglIntFlush_impl, (uint32_t flushgl, uint32_t flushvg))
+
+-FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position))
++FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position, DISPMANX_RESOURCE_HANDLE_T new_back_buffer))
+ FN(void, eglIntSelectMipmap_impl, (EGL_SURFACE_ID_T s, int level))
+
+ FN(void, eglIntGetColorData_impl, (EGL_SURFACE_ID_T s, KHRN_IMAGE_FORMAT_T format, uint32_t width, uint32_t height, int32_t stride, uint32_t y_offset, void *data))
+--
+1.8.5.1
diff --git a/media-libs/raspberrypi-userland/files/wayland-wsys.patch b/media-libs/raspberrypi-userland/files/wayland-wsys.patch
new file mode 100644
index 0000000..e69de29
diff --git a/media-libs/raspberrypi-userland/raspberrypi-userland-0_pre20160305.ebuild b/media-libs/raspberrypi-userland/raspberrypi-userland-0_pre20160305-r1.ebuild
similarity index 74%
rename from media-libs/raspberrypi-userland/raspberrypi-userland-0_pre20160305.ebuild
rename to media-libs/raspberrypi-userland/raspberrypi-userland-0_pre20160305-r1.ebuild
index 5676f12..8ef911f 100644
--- a/media-libs/raspberrypi-userland/raspberrypi-userland-0_pre20160305.ebuild
+++ b/media-libs/raspberrypi-userland/raspberrypi-userland-0_pre20160305-r1.ebuild
@@ -21,7 +21,12 @@ else
S="${WORKDIR}/raspberrypi-userland-${GIT_COMMIT}"
fi
-IUSE="examples"
+RDEPEND="!media-libs/raspberrypi-userland-bin
+ wayland? ( dev-libs/wayland )"
+DEPEND="${RDEPEND}
+ wayland? ( virtual/pkgconfig )"
+
+IUSE="examples wayland"
LICENSE="BSD"
SLOT="0"
@@ -42,15 +47,21 @@ src_unpack() {
src_prepare() {
# init script for Debian, not useful on Gentoo
sed -i "/DESTINATION \/etc\/init.d/,+2d" interface/vmcs_host/linux/vcfiled/CMakeLists.txt || die
+
+ # wayland egl support
+ epatch "${FILESDIR}"/next-resource-handle.patch \
+ "${FILESDIR}"/wayland-wsys.patch
}
src_install() {
cmake-utils_src_install
+ # provide OpenGL ES v1 according to https://github.com/raspberrypi/firmware/issues/78
+ dosym libGLESv2.so /opt/vc/lib/libGLESv1_CM.so
+
doenvd "${FILESDIR}"/04${PN}
- dodir /etc/udev/rules.d
- insinto /etc/udev/rules.d
+ insinto /lib/udev/rules.d
doins "${FILESDIR}"/92-local-vchiq-permissions.rules
# enable dynamic switching of the GL implementation
@@ -60,6 +71,16 @@ src_install() {
# tell eselect opengl that we do not have libGL
touch "${ED}"/opt/vc/.gles-only
+ insinto /opt/vc/lib/pkgconfig
+ doins "${FILESDIR}"/bcm_host.pc
+ doins "${FILESDIR}"/egl.pc
+ doins "${FILESDIR}"/glesv2.pc
+ if use wayland; then
+ # Missing wayland-egl version from the patch; claim 9.0 (a mesa version) for now, so gst-plugins-bad wayland-egl check is happy
+ sed -i -e 's/Version: /Version: 9.0/' "${ED}"/opt/vc/lib/pkgconfig/wayland-egl.pc
+ doins "${ED}"/opt/vc/lib/pkgconfig/wayland-egl.pc # Maybe move?
+ fi
+
# some #include instructions are wrong so we need to fix them
einfo "Fixing #include \"vcos_platform_types.h\""
for file in $(grep -l "#include \"vcos_platform_types.h\"" "${D}"/opt/vc/include/* -r); do
next reply other threads:[~2016-03-10 14:05 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-10 14:04 Miroslav Šulc [this message]
-- strict thread matches above, loose matches on Subject: below --
2020-11-23 4:52 [gentoo-commits] repo/gentoo:master commit in: media-libs/raspberrypi-userland/files/, media-libs/raspberrypi-userland/ Sam James
2017-07-19 8:56 Patrice Clement
2016-05-11 12:27 Alfredo Tupone
2016-03-08 23:20 Miroslav Šulc
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=1457618683.06c415c57f1452d3376499ff82128d9b7013f64a.fordfrog@gentoo \
--to=fordfrog@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox