From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PATCH 040/132] meson: add modules infrastructure
Date: Thu, 12 Dec 2019 13:51:24 +0100 [thread overview]
Message-ID: <1576155176-2464-41-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1576155176-2464-1-git-send-email-pbonzini@redhat.com>
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
Makefile | 10 +---------
Makefile.target | 6 ++++++
meson.build | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
rules.mak | 10 +++++-----
scripts/undefsym.sh | 20 ++++++++++++++++++++
5 files changed, 85 insertions(+), 14 deletions(-)
create mode 100755 scripts/undefsym.sh
diff --git a/Makefile b/Makefile
index bae96ec..c8c402a 100644
--- a/Makefile
+++ b/Makefile
@@ -212,7 +212,7 @@ subdir-capstone: capstone/all
subdir-slirp: slirp/all
$(filter %/all, $(TARGET_DIRS_RULES)): libqemuutil.a $(common-obj-y) \
- $(qom-obj-y)
+ $(qom-obj-y) block.syms qemu.syms
ROM_DIRS = $(addprefix pc-bios/, $(ROMS))
ROM_DIRS_RULES=$(foreach t, all clean, $(addsuffix /$(t), $(ROM_DIRS)))
@@ -431,14 +431,6 @@ install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstated
ifneq ($(TOOLS),)
$(call install-prog,$(TOOLS),$(DESTDIR)$(bindir))
endif
-ifneq ($(CONFIG_MODULES),)
- $(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
- for s in $(modules-m:.mo=$(DSOSUF)); do \
- t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
- $(INSTALL_LIB) $$s "$$t"; \
- test -z "$(STRIP)" || $(STRIP) "$$t"; \
- done
-endif
ifneq ($(HELPERS-y),)
$(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
endif
diff --git a/Makefile.target b/Makefile.target
index 74e8295..a0eb332 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -161,6 +161,12 @@ obj-y += memory_mapping.o
obj-y += migration/ram.o
LIBS := $(libs_softmmu) $(LIBS)
+# Temporary until emulators are linked by Meson
+LIBS := $(LIBS) @../block.syms @../qemu.syms
+ifneq ($(CONFIG_MODULES),y)
+LIBS := $(LIBS)
+endif
+
# Hardware support
ifeq ($(TARGET_NAME), sparc64)
obj-y += hw/sparc64/
diff --git a/meson.build b/meson.build
index 8d5b28b..3c292c6 100644
--- a/meson.build
+++ b/meson.build
@@ -6,6 +6,8 @@ ss = import('sourceset')
config_host = kconfig.load(meson.current_build_dir() / 'config-host.mak')
config_all_disas = kconfig.load(meson.current_build_dir() / 'config-all-disas.mak')
+enable_modules = 'CONFIG_MODULES' in config_host
+
add_project_arguments(config_host['CFLAGS'].split(),
language: ['c', 'objc'])
add_project_arguments(config_host['QEMU_CFLAGS'].split(),
@@ -264,6 +266,7 @@ endforeach
util_ss = ss.source_set()
stub_ss = ss.source_set()
trace_ss = ss.source_set()
+block_ss = ss.source_set()
common_ss = ss.source_set()
softmmu_ss = ss.source_set()
user_ss = ss.source_set()
@@ -271,6 +274,7 @@ bsd_user_ss = ss.source_set()
linux_user_ss = ss.source_set()
specific_ss = ss.source_set()
+modules = {}
hw_arch = {}
target_arch = {}
target_softmmu_arch = {}
@@ -372,6 +376,12 @@ subdir('authz')
subdir('crypto')
subdir('ui')
+
+if enable_modules
+ libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
+ modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
+endif
+
# Build targets from sourcesets
stub_ss = stub_ss.apply(config_host, strict: false)
@@ -387,6 +397,49 @@ qemuutil = declare_dependency(link_with: libqemuutil,
subdir('io')
subdir('fsdev')
+mods = []
+block_mods = []
+softmmu_mods = []
+foreach d, list : modules
+ foreach m : list
+ if enable_modules and host_machine.system() != 'windows'
+ sl = static_library(d + '-' + m[0], m[1], dependencies: [m[2], modulecommon], pic: true)
+ if d == 'block'
+ block_mods += sl
+ else
+ softmmu_mods += sl
+ endif
+ mods += {'dir': d, 'name': m[0], 'lib': sl, 'deps': m[2]}
+ else
+ if d == 'block'
+ block_ss.add(when: m[2], if_true: m[1])
+ else
+ softmmu_ss.add(when: m[2], if_true: m[1])
+ endif
+ endif
+ endforeach
+endforeach
+
+nm = find_program('nm')
+undefsym = find_program('scripts/undefsym.sh')
+block_syms = custom_target('block.syms', output: 'block.syms',
+ input: [libqemuutil, block_mods],
+ capture: true,
+ command: [undefsym, nm, '@INPUT@'])
+qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
+ input: [libqemuutil, softmmu_mods],
+ capture: true,
+ command: [undefsym, nm, '@INPUT@'])
+
+
+foreach m : mods
+ shared_module(m['dir'] + '-' + m['name'],
+ name_prefix: '',
+ link_whole: [m['lib']],
+ install: true,
+ install_dir: config_host['qemu_moddir'])
+endforeach
+
common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
diff --git a/rules.mak b/rules.mak
index 9dd3b7e..8571aec 100644
--- a/rules.mak
+++ b/rules.mak
@@ -61,17 +61,17 @@ endif
# This is necessary because the exectuable itself may not use the function, in
# which case the function would not be linked in. Then the DSO loading will
# fail because of the missing symbol.
-process-archive-undefs = $(filter-out %.a %.fa %.mo,$1) \
+process-archive-undefs = $(filter-out %.a %.fa %.mo %$(DSOSUF),$1) \
$(addprefix $(WL_U), \
$(filter $(call defined-symbols,$(filter %.a %.fa, $1)), \
- $(call undefined-symbols,$(filter %.mo,$1)))) \
+ $(call undefined-symbols,$(filter %.mo %$(DSOSUF),$1)))) \
$(foreach l,$(filter %.fa,$1),$(call whole-archive,$l)) \
$(filter %.a,$1)
-extract-libs = $(strip $(foreach o,$(filter-out %.mo,$1),$($o-libs)))
+extract-libs = $(strip $(foreach o,$(filter-out %.mo %$(DSOSUF),$1),$($o-libs)))
expand-objs = $(strip $(sort $(filter %.o,$1)) \
- $(foreach o,$(filter %.mo,$1),$($o-objs)) \
- $(filter-out %.o %.mo,$1))
+ $(foreach o,$(filter %.mo %$(DSOSUF),$1),$($o-objs)) \
+ $(filter-out %.o %.mo %$(DSOSUF),$1))
%.o: %.c
@mkdir -p $(dir $@)
diff --git a/scripts/undefsym.sh b/scripts/undefsym.sh
new file mode 100755
index 0000000..d4871f0
--- /dev/null
+++ b/scripts/undefsym.sh
@@ -0,0 +1,20 @@
+#! /bin/bash
+
+# Before a shared module's DSO is produced, a static library is built for it
+# and passed to this script. The script generates -Wl,-u options to force
+# the inclusion of symbol from libqemuutil.a if the shared modules need them,
+# This is necessary because the modules may use functions not needed by the
+# executable itself, which would cause the function to not be linked in.
+# Then the DSO loading would fail because of the missing symbol.
+
+if test $# -le 2; then
+ exit 0
+fi
+
+NM=$1
+staticlib=$2
+shift 2
+# Find symbols defined in static libraries and undefined in shared modules
+comm -12 \
+ <( $NM -P -g $staticlib | awk '$2!="U"{print "-Wl,-u," $1}' | sort -u) \
+ <( $NM -P -g "$@" | awk '$2=="U"{print "-Wl,-u," $1}' | sort -u)
--
1.8.3.1
next prev parent reply other threads:[~2019-12-12 13:24 UTC|newest]
Thread overview: 142+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-12 12:50 [RFC PATCH v3 000/132] Proof of concept for Meson integration Paolo Bonzini
2019-12-12 12:50 ` [PATCH 001/132] build-sys hack: ensure target directory is there Paolo Bonzini
2019-12-12 12:50 ` [PATCH 002/132] configure: do not include $(...) variables in config-host.mak Paolo Bonzini
2019-12-12 12:50 ` [PATCH 003/132] configure: expand path variables for meson configure Paolo Bonzini
2019-12-12 12:50 ` [PATCH 004/132] configure: integrate Meson in the build system Paolo Bonzini
2019-12-12 12:50 ` [PATCH 005/132] configure: generate Meson cross file Paolo Bonzini
2019-12-12 12:50 ` [PATCH 006/132] build-sys: add meson submodule Paolo Bonzini
2019-12-12 12:50 ` [PATCH 007/132] meson: enable pie Paolo Bonzini
2019-12-12 12:50 ` [PATCH 008/132] meson: use coverage option Paolo Bonzini
2019-12-12 12:50 ` [PATCH 009/132] libqemuutil: convert to meson Paolo Bonzini
2019-12-12 12:50 ` [PATCH 010/132] meson: add remaining generated tcg trace helpers Paolo Bonzini
2019-12-12 12:50 ` [PATCH 011/132] meson: add version.o Paolo Bonzini
2019-12-12 12:50 ` [PATCH 012/132] contrib/libvhost-user: convert to Meson Paolo Bonzini
2019-12-12 12:50 ` [PATCH 013/132] contrib/vhost-user-blk: " Paolo Bonzini
2019-12-12 12:50 ` [PATCH 014/132] contrib/vhost-user-scsi: " Paolo Bonzini
2019-12-12 12:50 ` [PATCH 015/132] contrib/rdmacm-mux: " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 016/132] contrib/vhost-user-input: convert to meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 017/132] contrib/vhost-user-gpu: " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 018/132] contrib/ivshmem: " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 019/132] contrib/elf2dmp: " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 020/132] meson: convert qemu-ga Paolo Bonzini
2019-12-12 12:51 ` [PATCH 021/132] meson: convert vss-win32 Paolo Bonzini
2019-12-12 12:51 ` [PATCH 022/132] meson: add msi generation Paolo Bonzini
2019-12-12 12:51 ` [PATCH 023/132] meson: add qemu-bridge-helper Paolo Bonzini
2019-12-12 12:51 ` [PATCH 024/132] meson: add qemu-keymap Paolo Bonzini
2019-12-12 12:51 ` [PATCH 025/132] meson: add qemu-edid Paolo Bonzini
2019-12-12 12:51 ` [PATCH 026/132] meson: add virtfs-proxy-helper Paolo Bonzini
2019-12-12 12:51 ` [PATCH 027/132] meson: keymap-gen Paolo Bonzini
2019-12-12 12:51 ` [PATCH 028/132] meson: generate qemu-version.h Paolo Bonzini
2019-12-12 12:51 ` [PATCH 029/132] meson: generate shader headers Paolo Bonzini
2019-12-12 12:51 ` [PATCH 030/132] meson: generate hxtool files Paolo Bonzini
2019-12-12 12:51 ` [PATCH 031/132] meson: configure 50-qemu-gpu.json Paolo Bonzini
2019-12-12 12:51 ` [PATCH 032/132] meson: uncompress edk2 bios Paolo Bonzini
2020-01-03 10:48 ` Philippe Mathieu-Daudé
2020-01-03 10:52 ` Philippe Mathieu-Daudé
2020-01-07 11:28 ` Paolo Bonzini
2019-12-12 12:51 ` [PATCH 033/132] build-sys hack: link with whole .fa archives Paolo Bonzini
2019-12-12 12:51 ` [PATCH 034/132] meson: convert qom directory to Meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 035/132] meson: convert authz " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 036/132] meson: convert crypto " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 037/132] meson: convert io " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 038/132] meson: infrastructure for building emulators Paolo Bonzini
2019-12-12 12:51 ` [PATCH 039/132] meson: add macos dependencies Paolo Bonzini
2019-12-12 12:51 ` Paolo Bonzini [this message]
2019-12-12 12:51 ` [PATCH 041/132] meson: convert chardev directory to Meson (tools part) Paolo Bonzini
2019-12-12 12:51 ` [PATCH 042/132] meson: convert block Paolo Bonzini
2019-12-12 12:51 ` [PATCH 043/132] meson: qemu-{img,io,nbd} Paolo Bonzini
2019-12-12 12:51 ` [PATCH 044/132] meson: qemu-pr-helper Paolo Bonzini
2019-12-12 12:51 ` [PATCH 045/132] configure, Makefile; remove TOOLS and HELPERS-y variable Paolo Bonzini
2019-12-12 12:51 ` [PATCH 046/132] meson: convert chardev directory to Meson (emulator part) Paolo Bonzini
2019-12-12 12:51 ` [PATCH 047/132] meson: convert audio directory to Meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 048/132] meson: convert ui " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 049/132] meson: convert root " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 050/132] meson: convert trace/ Paolo Bonzini
2019-12-12 12:51 ` [PATCH 051/132] meson: convert qom/ Paolo Bonzini
2019-12-12 12:51 ` [PATCH 052/132] meson: convert block/ Paolo Bonzini
2019-12-12 12:51 ` [PATCH 053/132] meson: convert dump/ Paolo Bonzini
2019-12-12 12:51 ` [PATCH 054/132] meson: convert monitor directory to Meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 055/132] meson: convert replay " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 056/132] meson: convert migration " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 057/132] meson: build softmmu-specific migration/ram.c Paolo Bonzini
2019-12-12 12:51 ` [PATCH 058/132] meson: convert net directory to Meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 059/132] meson: convert backends " Paolo Bonzini
2019-12-12 12:51 ` [PATCH 060/132] meson: convert fsdev/ Paolo Bonzini
2019-12-12 12:51 ` [PATCH 061/132] meson: convert disas directory to Meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 062/132] meson: convert qapi-specific to meson Paolo Bonzini
2019-12-12 12:51 ` [PATCH 063/132] meson: convert hw/xen Paolo Bonzini
2019-12-12 12:51 ` [PATCH 064/132] meson: convert hw/core Paolo Bonzini
2019-12-12 12:51 ` [PATCH 065/132] meson: convert hw/semihosting Paolo Bonzini
2019-12-12 12:51 ` [PATCH 066/132] meson: convert hw/smbios Paolo Bonzini
2019-12-12 12:51 ` [PATCH 067/132] meson: convert hw/mem Paolo Bonzini
2019-12-12 12:51 ` [PATCH 068/132] meson: convert hw/watchdog Paolo Bonzini
2019-12-12 12:51 ` [PATCH 069/132] meson: convert hw/virtio Paolo Bonzini
2019-12-12 12:51 ` [PATCH 070/132] meson: convert hw/vfio Paolo Bonzini
2019-12-12 12:51 ` [PATCH 071/132] meson: convert hw/usb Paolo Bonzini
2019-12-12 12:51 ` [PATCH 072/132] meson: convert hw/tpm Paolo Bonzini
2019-12-12 12:51 ` [PATCH 073/132] meson: convert hw/timer Paolo Bonzini
2019-12-12 12:51 ` [PATCH 074/132] meson: convert hw/ssi Paolo Bonzini
2019-12-12 12:51 ` [PATCH 075/132] meson: convert hw/sd Paolo Bonzini
2019-12-12 12:52 ` [PATCH 076/132] meson: convert hw/scsi Paolo Bonzini
2019-12-12 12:52 ` [PATCH 077/132] meson: convert hw/pcmcia Paolo Bonzini
2019-12-12 12:52 ` [PATCH 078/132] meson: convert hw/pci-host Paolo Bonzini
2019-12-12 12:52 ` [PATCH 079/132] meson: convert hw/pci-bridge Paolo Bonzini
2019-12-12 12:52 ` [PATCH 080/132] meson: convert hw/pci Paolo Bonzini
2019-12-12 12:52 ` [PATCH 081/132] meson: convert hw/nvram Paolo Bonzini
2019-12-12 12:52 ` [PATCH 082/132] meson: convert hw/rdma Paolo Bonzini
2019-12-12 12:52 ` [PATCH 083/132] meson: convert hw/net Paolo Bonzini
2019-12-12 12:52 ` [PATCH 084/132] meson: convert hw/misc Paolo Bonzini
2019-12-12 12:52 ` [PATCH 085/132] meson: convert hw/isa Paolo Bonzini
2019-12-12 12:52 ` [PATCH 086/132] meson: convert hw/ipmi Paolo Bonzini
2019-12-12 12:52 ` [PATCH 087/132] meson: convert hw/ipack Paolo Bonzini
2019-12-12 12:52 ` [PATCH 088/132] meson: convert hw/intc Paolo Bonzini
2019-12-12 12:52 ` [PATCH 089/132] meson: convert hw/input Paolo Bonzini
2019-12-12 12:52 ` [PATCH 090/132] meson: convert hw/ide Paolo Bonzini
2019-12-12 12:52 ` [PATCH 091/132] meson: convert hw/i2c Paolo Bonzini
2019-12-12 12:52 ` [PATCH 092/132] meson: convert hw/hyperv Paolo Bonzini
2019-12-12 12:52 ` [PATCH 093/132] meson: convert hw/gpio Paolo Bonzini
2019-12-19 7:25 ` [RFC PATCH v3 000/132] Proof of concept for Meson integration Markus Armbruster
2019-12-19 12:32 ` Paolo Bonzini
2019-12-19 12:23 ` [PATCH 092/132] meson: convert hw/hyperv Paolo Bonzini
2019-12-19 12:23 ` [PATCH 093/132] meson: convert hw/gpio Paolo Bonzini
2019-12-19 12:23 ` [PATCH 094/132] meson: convert hw/dma Paolo Bonzini
2019-12-19 12:23 ` [PATCH 095/132] meson: convert hw/display Paolo Bonzini
2019-12-19 12:23 ` [PATCH 096/132] meson: convert hw/cpu Paolo Bonzini
2019-12-19 12:23 ` [PATCH 097/132] meson: convert hw/char Paolo Bonzini
2019-12-19 12:23 ` [PATCH 098/132] meson: convert hw/bt Paolo Bonzini
2019-12-19 12:23 ` [PATCH 099/132] meson: convert hw/block Paolo Bonzini
2019-12-19 12:23 ` [PATCH 100/132] meson: convert hw/audio Paolo Bonzini
2019-12-19 12:23 ` [PATCH 101/132] meson: convert hw/adc Paolo Bonzini
2019-12-19 12:23 ` [PATCH 102/132] meson: convert hw/acpi Paolo Bonzini
2019-12-19 12:23 ` [PATCH 103/132] meson: convert hw/9pfs Paolo Bonzini
2019-12-19 12:23 ` [PATCH 104/132] meson: convert target/s390x/gen-features.h Paolo Bonzini
2019-12-19 12:23 ` [PATCH 105/132] meson: convert hw/arch* Paolo Bonzini
2019-12-19 12:23 ` [PATCH 106/132] meson: target Paolo Bonzini
2019-12-19 12:23 ` [PATCH 107/132] meson: accel Paolo Bonzini
2019-12-19 12:23 ` [PATCH 108/132] meson: linux-user Paolo Bonzini
2019-12-19 16:07 ` Laurent Vivier
2019-12-19 12:23 ` [PATCH 109/132] meson: bsd-user Paolo Bonzini
2019-12-19 12:23 ` [PATCH 110/132] meson: cpu-emu Paolo Bonzini
2019-12-19 12:23 ` [PATCH 111/132] meson: softmmu Paolo Bonzini
2019-12-19 12:23 ` [PATCH 112/132] Aaaaallelujah! Paolo Bonzini
2019-12-19 12:23 ` [PATCH 113/132] systemtap Paolo Bonzini
2019-12-19 12:23 ` [PATCH 114/132] build-sys/rules.mak: remove version.o Paolo Bonzini
2019-12-19 12:23 ` [PATCH 115/132] remove Makefile.target Paolo Bonzini
2019-12-19 12:23 ` [PATCH 116/132] meson: sphinx-build Paolo Bonzini
2019-12-19 12:23 ` [PATCH 117/132] meson: generate version.texi Paolo Bonzini
2019-12-19 12:23 ` [PATCH 118/132] meson: build texi doc Paolo Bonzini
2019-12-19 12:23 ` [PATCH 119/132] meson: add NSIS building Paolo Bonzini
2019-12-19 12:23 ` [PATCH 120/132] meson: install some scripts Paolo Bonzini
2019-12-19 12:23 ` [PATCH 121/132] meson: install edk2 Paolo Bonzini
2020-01-03 10:51 ` Philippe Mathieu-Daudé
2019-12-19 12:23 ` [PATCH 122/132] meson: install blobs Paolo Bonzini
2019-12-19 12:23 ` [PATCH 123/132] meson: install edk2 json descriptors Paolo Bonzini
2019-12-19 12:23 ` [PATCH 124/132] meson: install icons Paolo Bonzini
2019-12-19 12:23 ` [PATCH 125/132] meson: install desktop file Paolo Bonzini
2019-12-19 12:23 ` [PATCH 126/132] meson: install keymaps Paolo Bonzini
2019-12-19 12:23 ` [PATCH 127/132] meson: convert po/ Paolo Bonzini
2019-12-19 12:23 ` [PATCH 128/132] meson: replace pc-bios/keymaps/Makefile Paolo Bonzini
2019-12-19 12:23 ` [PATCH 129/132] meson: replace mostly useless pc-bios/Makefile Paolo Bonzini
2019-12-19 12:23 ` [PATCH 130/132] meson: convert pc-bios/s390-ccw Paolo Bonzini
2019-12-19 12:23 ` [PATCH 131/132] meson: convert pc-bios/optionrom Paolo Bonzini
2019-12-19 12:23 ` [PATCH 132/132] rules.mak: drop unneeded macros Paolo Bonzini
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=1576155176-2464-41-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.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;
as well as URLs for NNTP newsgroup(s).