* [Qemu-devel] [PATCH, RFC] Smarter compilation for target devices
@ 2009-04-22 19:34 Blue Swirl
2009-04-28 13:32 ` Paul Brook
0 siblings, 1 reply; 4+ messages in thread
From: Blue Swirl @ 2009-04-22 19:34 UTC (permalink / raw)
To: qemu-devel
Compile target devices only once for each endian and word size combination,
saving a few compiles if large number of targets are enabled.
---
Makefile.libqemuhw | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++
Makefile.target | 30 +++++++++++-
configure | 70 +++++++++++++++++++++++++++++-
3 files changed, 219 insertions(+), 4 deletions(-)
create mode 100644 Makefile.libqemuhw
diff --git a/Makefile.libqemuhw b/Makefile.libqemuhw
new file mode 100644
index 0000000..7aeae21
--- /dev/null
+++ b/Makefile.libqemuhw
@@ -0,0 +1,123 @@
+include config.mak
+include $(SRC_PATH)/rules.mak
+
+VPATH=$(SRC_PATH):$(SRC_PATH)/hw
+CPPFLAGS=-I. -I.. -I$(SRC_PATH) -MMD -MT $@ -MP -DNEED_CPU_H
+#CFLAGS+=-Werror
+
+ifeq ($(ARCH),alpha)
+# Ensure there's only a single GP
+CFLAGS+=-msmall-data
+endif
+
+ifeq ($(ARCH),ia64)
+CFLAGS+=-mno-sdata
+endif
+
+CFLAGS+=$(OS_CFLAGS) $(ARCH_CFLAGS)
+LDFLAGS+=$(OS_LDFLAGS) $(ARCH_LDFLAGS)
+
+CPPFLAGS+=-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
+ifdef CONFIG_SOLARIS
+ifdef NEEDS_LIBSUNMATH
+CFLAGS+=-I/opt/SUNWspro/prod/include/cc
+endif
+endif
+
+CPPFLAGS+=-I$(SRC_PATH)/fpu
+
+# Warning: Do not add new files here if they have conditional code
+# with #ifdef TARGET_xxx etc, use TARGET_PAGE_SIZE or reference
+# CPUState
+
+# Common objects used by most targets
+OBJS+=fw_cfg.o
+
+# Target specific objects
+ifdef TARGET_I386
+LIBLE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_X86_64
+LIBLE64OBJS+=$(OBJS)
+endif
+
+PPCOBJS=escc.o
+
+ifdef TARGET_PPC
+LIBBE32OBJS+=$(PPCOBJS)
+LIBBE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_PPC64
+LIBBE64OBJS+=$(PPCOBJS)
+LIBBE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_MIPS
+LIBBE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_MIPSEL
+LIBLE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_MIPS64
+LIBBE64OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_MIPSEL64
+LIBLE64OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_CRIS
+LIBLE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_SPARC
+LIBBE32OBJS+=escc.o
+LIBBE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_SPARC64
+LIBBE64OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_ARM
+LIBLE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_ARMEB
+LIBBE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_SH4
+LIBLE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_SH4EB
+LIBBE32OBJS+=$(OBJS)
+endif
+
+ifdef TARGET_M68K
+LIBBE32OBJS+=$(OBJS)
+endif
+
+all: $(LIB)
+
+libqemuhw_le32.a: $(LIBLE32OBJS)
+
+libqemuhw_be32.a: $(LIBBE32OBJS)
+
+libqemuhw_le64.a: $(LIBLE64OBJS)
+
+libqemuhw_be64.a: $(LIBBE64OBJS)
+
+clean:
+ rm -f *.o *.a *~
+ rm -f *.d */*.d
+
+install: all
+
+# Include automatically generated dependency files
+-include $(wildcard *.d */*.d)
diff --git a/Makefile.target b/Makefile.target
index 2171587..f28fb11 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -501,7 +501,6 @@ OBJS=vl.o osdep.o monitor.o pci.o loader.o
isa_mmio.o machine.o dma-helpers.o
# virtio has to be here due to weird dependency between PCI and virtio-net.
# need to fix this properly
OBJS+=virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-console.o
-OBJS+=fw_cfg.o
ifdef CONFIG_KVM
OBJS+=kvm.o kvm-all.o
endif
@@ -589,6 +588,11 @@ OBJS+= cirrus_vga.o apic.o ioapic.o parallel.o
acpi.o piix_pci.o
OBJS+= usb-uhci.o vmmouse.o vmport.o vmware_vga.o hpet.o
OBJS += device-hotplug.o pci-hotplug.o smbios.o
CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE
+ifeq ($(TARGET_ARCH), i386)
+LIBS+=../lible32/libqemuhw_le32.a
+else
+LIBS+=../lible64/libqemuhw_le64.a
+endif
endif
ifeq ($(TARGET_BASE_ARCH), ppc)
CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE
@@ -598,7 +602,7 @@ OBJS+= ppc.o ide.o vga.o $(SOUND_HW) dma.o openpic.o
OBJS+= pckbd.o serial.o i8259.o i8254.o fdc.o m48t59.o mc146818rtc.o
OBJS+= prep_pci.o ppc_prep.o
# Mac shared devices
-OBJS+= macio.o cuda.o adb.o mac_nvram.o mac_dbdma.o escc.o
+OBJS+= macio.o cuda.o adb.o mac_nvram.o mac_dbdma.o
# OldWorld PowerMac
OBJS+= heathrow_pic.o grackle_pci.o ppc_oldworld.o
# NewWorld PowerMac
@@ -615,6 +619,11 @@ endif
ifdef CONFIG_KVM
OBJS+= kvm_ppc.o
endif
+ifeq ($(TARGET_ARCH), ppc64)
+LIBS+=../libbe64/libqemuhw_be64.a
+else
+LIBS+=../libbe32/libqemuhw_be32.a
+endif
endif
ifeq ($(TARGET_BASE_ARCH), mips)
OBJS+= mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o
@@ -625,6 +634,11 @@ OBJS+= piix_pci.o parallel.o cirrus_vga.o pcspk.o
$(SOUND_HW)
OBJS+= mipsnet.o
OBJS+= pflash_cfi01.o
OBJS+= vmware_vga.o
+ifeq ($(TARGET_ARCH), mips)
+LIBS+=../libbe32/libqemuhw_be32.a
+else
+LIBS+=../lible32/libqemuhw_le32.a
+endif
CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE
endif
ifeq ($(TARGET_BASE_ARCH), cris)
@@ -639,16 +653,19 @@ OBJS+= etraxfs_timer.o
OBJS+= etraxfs_ser.o
OBJS+= pflash_cfi02.o nand.o
+LIBS+=../lible32/libqemuhw_le32.a
endif
ifeq ($(TARGET_BASE_ARCH), sparc)
ifeq ($(TARGET_ARCH), sparc64)
OBJS+= sun4u.o ide.o pckbd.o vga.o apb_pci.o
OBJS+= fdc.o mc146818rtc.o serial.o m48t59.o
OBJS+= cirrus_vga.o parallel.o
+LIBS+=../libbe64/libqemuhw_be64.a
else
OBJS+= sun4m.o tcx.o pcnet.o iommu.o m48t59.o slavio_intctl.o
-OBJS+= slavio_timer.o escc.o slavio_misc.o fdc.o sparc32_dma.o
+OBJS+= slavio_timer.o slavio_misc.o fdc.o sparc32_dma.o
OBJS+= cs4231.o eccmemctl.o sbi.o sun4c_intctl.o
+LIBS+=../libbe32/libqemuhw_be32.a
endif
endif
ifeq ($(TARGET_BASE_ARCH), arm)
@@ -670,16 +687,23 @@ OBJS+= nseries.o blizzard.o onenand.o vga.o
cbus.o tusb6010.o usb-musb.o
OBJS+= mst_fpga.o mainstone.o
OBJS+= musicpal.o pflash_cfi02.o
OBJS+= framebuffer.o
+ifeq ($(TARGET_ARCH), armeb)
+LIBS+=../libbe32/libqemuhw_be32.a
+else
+LIBS+=../lible32/libqemuhw_le32.a
+endif
CPPFLAGS += -DHAS_AUDIO
endif
ifeq ($(TARGET_BASE_ARCH), sh4)
OBJS+= shix.o r2d.o sh7750.o sh7750_regnames.o tc58128.o
OBJS+= sh_timer.o sh_serial.o sh_intc.o sh_pci.o sm501.o serial.o
OBJS+= ide.o
+LIBS+=../lible32/libqemuhw_le32.a
endif
ifeq ($(TARGET_BASE_ARCH), m68k)
OBJS+= an5206.o mcf5206.o mcf_uart.o mcf_intc.o mcf5208.o mcf_fec.o
OBJS+= m68k-semi.o dummy_m68k.o
+LIBS+=../libbe32/libqemuhw_be32.a
endif
ifdef CONFIG_GDBSTUB
OBJS+=gdbstub.o gdbstub-xml.o
diff --git a/configure b/configure
index b7b7b01..8669fd4 100755
--- a/configure
+++ b/configure
@@ -1339,7 +1339,53 @@ fi
#if test "$sdl_static" = "no"; then
# echo "WARNING: cannot compile statically with SDL - qemu-fast
won't have a graphical output"
#fi
+
+for bits in 32 64 ; do
+ for endian in be le; do
+ dir=$endian$bits
+ libdir=lib$dir
+ libconfig_h=$libdir/config.h
+ libconfig_mak=$libdir/config.mak
+ mkdir -p $libdir
+ echo "/* Automatically generated by configure - do not modify
*/" > $libconfig_h
+ echo "#include \"../config-host.h\"" >> $libconfig_h
+ if test "$endian" = "be" ; then
+ words="#define TARGET_WORDS_BIGENDIAN"
+ else
+ words=
+ fi
+ cat >$libdir/cpu.h <<EOF
+#ifndef CPU_H
+#define CPU_H
+
+$words
+#define TARGET_LONG_BITS $bits
+#define TARGET_PAGE_BITS invalid_page_bits
+extern int invalid_page_bits;
+
+#define CPUState struct CPUDummyState
+
+#include "config.h"
+#include "cpu-defs.h"
+#include "cpu-all.h"
+
+#endif
+EOF
+#
+# don't use ln -sf as not all "ln -sf" over write the file/link
+#
+ rm -f $libdir/Makefile
+ ln -s $source_path/Makefile.libqemuhw $libdir/Makefile
+
+ echo "# Automatically generated by configure - do not modify"
> $libconfig_mak
+ echo "include ../config-host.mak" >> $libconfig_mak
+ echo "include ../config-libs.mak" >> $libconfig_mak
+ echo "LIB=libqemuhw_$dir.a" >> $libconfig_mak
+ done
+done
+
config_mak="config-host.mak"
+configlibs_mak="config-libs.mak"
config_h="config-host.h"
#echo "Creating $config_mak and $config_h"
@@ -1351,6 +1397,7 @@ printf "# Configured with:" >> $config_mak
printf " '%s'" "$0" "$@" >> $config_mak
echo >> $config_mak
echo "/* Automatically generated by configure - do not modify */" > $config_h
+echo "# Automatically generated by configure - do not modify" > $configlibs_mak
echo "prefix=$prefix" >> $config_mak
echo "bindir=\${prefix}$binsuffix" >> $config_mak
@@ -1582,7 +1629,7 @@ echo "SRC_PATH=$source_path" >> $config_mak
if [ "$source_path_used" = "yes" ]; then
echo "VPATH=$source_path" >> $config_mak
fi
-echo "TARGET_DIRS=$target_list" >> $config_mak
+echo "TARGET_DIRS=libbe32 lible32 libbe64 lible64 $target_list" >> $config_mak
if [ "$build_docs" = "yes" ] ; then
echo "BUILD_DOCS=yes" >> $config_mak
fi
@@ -1791,6 +1838,7 @@ case "$target_cpu" in
echo "TARGET_ARCH=i386" >> $config_mak
echo "#define TARGET_ARCH \"i386\"" >> $config_h
echo "#define TARGET_I386 1" >> $config_h
+ echo "TARGET_I386=yes" >> $configlibs_mak
if test $kqemu = "yes" -a "$target_softmmu" = "yes"
then
echo "CONFIG_KQEMU=yes" >> $config_mak
@@ -1812,6 +1860,7 @@ case "$target_cpu" in
echo "#define TARGET_ARCH \"x86_64\"" >> $config_h
echo "#define TARGET_I386 1" >> $config_h
echo "#define TARGET_X86_64 1" >> $config_h
+ echo "TARGET_X86_64=yes" >> $configlibs_mak
if test $kqemu = "yes" -a "$target_softmmu" = "yes" -a $cpu = "x86_64"
then
echo "CONFIG_KQEMU=yes" >> $config_mak
@@ -1832,11 +1881,17 @@ case "$target_cpu" in
echo "TARGET_ARCH=alpha" >> $config_mak
echo "#define TARGET_ARCH \"alpha\"" >> $config_h
echo "#define TARGET_ALPHA 1" >> $config_h
+ echo "TARGET_ALPHA=yes" >> $configlibs_mak
;;
arm|armeb)
echo "TARGET_ARCH=arm" >> $config_mak
echo "#define TARGET_ARCH \"arm\"" >> $config_h
echo "#define TARGET_ARM 1" >> $config_h
+ if test "$target_cpu" = "arm" ; then
+ echo "TARGET_ARM=yes" >> $configlibs_mak
+ else
+ echo "TARGET_ARMEB=yes" >> $configlibs_mak
+ fi
bflt="yes"
target_nptl="yes"
gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
@@ -1845,12 +1900,14 @@ case "$target_cpu" in
echo "TARGET_ARCH=cris" >> $config_mak
echo "#define TARGET_ARCH \"cris\"" >> $config_h
echo "#define TARGET_CRIS 1" >> $config_h
+ echo "TARGET_CRIS=yes" >> $configlibs_mak
target_nptl="yes"
;;
m68k)
echo "TARGET_ARCH=m68k" >> $config_mak
echo "#define TARGET_ARCH \"m68k\"" >> $config_h
echo "#define TARGET_M68K 1" >> $config_h
+ echo "TARGET_M68K=yes" >> $configlibs_mak
bflt="yes"
gdb_xml_files="cf-core.xml cf-fp.xml"
;;
@@ -1859,12 +1916,14 @@ case "$target_cpu" in
echo "#define TARGET_ARCH \"mips\"" >> $config_h
echo "#define TARGET_MIPS 1" >> $config_h
echo "#define TARGET_ABI_MIPSO32 1" >> $config_h
+ echo "TARGET_MIPS=yes" >> $configlibs_mak
;;
mipsn32|mipsn32el)
echo "TARGET_ARCH=mipsn32" >> $config_mak
echo "#define TARGET_ARCH \"mipsn32\"" >> $config_h
echo "#define TARGET_MIPS 1" >> $config_h
echo "#define TARGET_ABI_MIPSN32 1" >> $config_h
+ echo "TARGET_MIPS=yes" >> $configlibs_mak
;;
mips64|mips64el)
echo "TARGET_ARCH=mips64" >> $config_mak
@@ -1872,11 +1931,13 @@ case "$target_cpu" in
echo "#define TARGET_MIPS 1" >> $config_h
echo "#define TARGET_MIPS64 1" >> $config_h
echo "#define TARGET_ABI_MIPSN64 1" >> $config_h
+ echo "TARGET_MIPS=yes" >> $configlibs_mak
;;
ppc)
echo "TARGET_ARCH=ppc" >> $config_mak
echo "#define TARGET_ARCH \"ppc\"" >> $config_h
echo "#define TARGET_PPC 1" >> $config_h
+ echo "TARGET_PPC=yes" >> $configlibs_mak
gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml
power-spe.xml"
;;
ppcemb)
@@ -1885,6 +1946,7 @@ case "$target_cpu" in
echo "#define TARGET_ARCH \"ppcemb\"" >> $config_h
echo "#define TARGET_PPC 1" >> $config_h
echo "#define TARGET_PPCEMB 1" >> $config_h
+ echo "TARGET_PPC=yes" >> $configlibs_mak
if test "$kvm" = "yes" ; then
echo "CONFIG_KVM=yes" >> $config_mak
echo "KVM_CFLAGS=$kvm_cflags" >> $config_mak
@@ -1898,6 +1960,7 @@ case "$target_cpu" in
echo "#define TARGET_ARCH \"ppc64\"" >> $config_h
echo "#define TARGET_PPC 1" >> $config_h
echo "#define TARGET_PPC64 1" >> $config_h
+ echo "TARGET_PPC64=yes" >> $configlibs_mak
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml
power-spe.xml"
;;
ppc64abi32)
@@ -1908,12 +1971,14 @@ case "$target_cpu" in
echo "#define TARGET_PPC 1" >> $config_h
echo "#define TARGET_PPC64 1" >> $config_h
echo "#define TARGET_ABI32 1" >> $config_h
+ echo "TARGET_PPC64=yes" >> $configlibs_mak
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml
power-spe.xml"
;;
sh4|sh4eb)
echo "TARGET_ARCH=sh4" >> $config_mak
echo "#define TARGET_ARCH \"sh4\"" >> $config_h
echo "#define TARGET_SH4 1" >> $config_h
+ echo "TARGET_SH4=yes" >> $configlibs_mak
bflt="yes"
target_nptl="yes"
;;
@@ -1921,12 +1986,14 @@ case "$target_cpu" in
echo "TARGET_ARCH=sparc" >> $config_mak
echo "#define TARGET_ARCH \"sparc\"" >> $config_h
echo "#define TARGET_SPARC 1" >> $config_h
+ echo "TARGET_SPARC=yes" >> $configlibs_mak
;;
sparc64)
echo "TARGET_ARCH=sparc64" >> $config_mak
echo "#define TARGET_ARCH \"sparc64\"" >> $config_h
echo "#define TARGET_SPARC 1" >> $config_h
echo "#define TARGET_SPARC64 1" >> $config_h
+ echo "TARGET_SPARC64=yes" >> $configlibs_mak
elfload32="yes"
;;
sparc32plus)
@@ -1937,6 +2004,7 @@ case "$target_cpu" in
echo "#define TARGET_SPARC 1" >> $config_h
echo "#define TARGET_SPARC64 1" >> $config_h
echo "#define TARGET_ABI32 1" >> $config_h
+ echo "TARGET_SPARC64=yes" >> $configlibs_mak
;;
*)
echo "Unsupported target CPU"
--
1.6.2.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH, RFC] Smarter compilation for target devices
2009-04-22 19:34 [Qemu-devel] [PATCH, RFC] Smarter compilation for target devices Blue Swirl
@ 2009-04-28 13:32 ` Paul Brook
2009-04-28 16:18 ` Blue Swirl
0 siblings, 1 reply; 4+ messages in thread
From: Paul Brook @ 2009-04-28 13:32 UTC (permalink / raw)
To: qemu-devel; +Cc: Blue Swirl
> Compile target devices only once for each endian and word size combination,
> saving a few compiles if large number of targets are enabled.
> +CPPFLAGS=-I. -I.. -I$(SRC_PATH) -MMD -MT $@ -MP -DNEED_CPU_H
> +# Warning: Do not add new files here if they have conditional code
> +# with #ifdef TARGET_xxx etc, use TARGET_PAGE_SIZE or reference
> +# CPUState
This is just asking for trouble. Anything that includes cpu.h must be rebuilt
for every cpu. IMO a necessary prerequisite for this change is reworking
header files so that you can't accidentally use the wrong symbols.
Also, which bitwidth are you intending to distinguish here? target_ulong or
target_phys_addr_t? With a few exceptions, devices don't care about the
former. Duplicating this logic is both cpu.h and configure is also asking for
trouble. At minimum the build should fail if they disagree.
Paul
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH, RFC] Smarter compilation for target devices
2009-04-28 13:32 ` Paul Brook
@ 2009-04-28 16:18 ` Blue Swirl
2009-04-28 17:25 ` Paul Brook
0 siblings, 1 reply; 4+ messages in thread
From: Blue Swirl @ 2009-04-28 16:18 UTC (permalink / raw)
To: Paul Brook; +Cc: qemu-devel
On 4/28/09, Paul Brook <paul@codesourcery.com> wrote:
> > Compile target devices only once for each endian and word size combination,
> > saving a few compiles if large number of targets are enabled.
>
>
> > +CPPFLAGS=-I. -I.. -I$(SRC_PATH) -MMD -MT $@ -MP -DNEED_CPU_H
>
>
> > +# Warning: Do not add new files here if they have conditional code
> > +# with #ifdef TARGET_xxx etc, use TARGET_PAGE_SIZE or reference
> > +# CPUState
>
>
> This is just asking for trouble. Anything that includes cpu.h must be rebuilt
> for every cpu. IMO a necessary prerequisite for this change is reworking
> header files so that you can't accidentally use the wrong symbols.
Yes, this was a hack. I think with your header change it will be much cleaner.
> Also, which bitwidth are you intending to distinguish here? target_ulong or
> target_phys_addr_t? With a few exceptions, devices don't care about the
target_phys_addr_t, of course. The devices that know about
target_ulong (or CPUState, TARGET_PAGE_SIZE) can't use this system.
> former. Duplicating this logic is both cpu.h and configure is also asking for
> trouble. At minimum the build should fail if they disagree.
Which logic?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH, RFC] Smarter compilation for target devices
2009-04-28 16:18 ` Blue Swirl
@ 2009-04-28 17:25 ` Paul Brook
0 siblings, 0 replies; 4+ messages in thread
From: Paul Brook @ 2009-04-28 17:25 UTC (permalink / raw)
To: qemu-devel; +Cc: Blue Swirl
> > former. Duplicating this logic is both cpu.h and configure is also
> > asking for trouble. At minimum the build should fail if they disagree.
>
> Which logic?
The logic that determines TARGET_PHYS_ADDR_BITS.
By my reading TARGET_PHYS_ADDR_BITS is alway 64 on 64-bit hosts, so there's no
reason to build separate libraries there.
On a related note, the current big/little endian handling is fairly
findamentally broken. It kinda works for the current set of targets. However
for other targets (e.g. big-endian arm, in particular ixp4xx) it doesn't work
because the endianess of the device depends which bus it's connected to. We
really need to push the byte swapping down to the softmmu/iotlb code.
Paul
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-04-28 17:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-22 19:34 [Qemu-devel] [PATCH, RFC] Smarter compilation for target devices Blue Swirl
2009-04-28 13:32 ` Paul Brook
2009-04-28 16:18 ` Blue Swirl
2009-04-28 17:25 ` Paul Brook
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).