# Network UPS Tools: man
#

# Notes:
# - sources (.txt) and groff formats are both distributed,
# - only sources are versioned ; groff files are generated at worst
#   during 'make dist' (while preparing a release tarball)
# - HTML files are built upon request, if AsciiDoc is available,
# - groff update will only happen if AsciiDoc is available too,
# - all this can probably (and hopefully) be improved, but I've not
#   found a way to do pattern replacement on the fly for target deps!
#   FIXME: investigate an autogen.sh hook
# - Ref: http://www.gnu.org/software/hello/manual/automake/Man-pages.html
# - WITH_MANS can be enabled if either we are building man-pages, or if
#   the --with-doc=man=auto detected an inability to build the man-pages
#   but enabled the DOC_INSTALL_DISTED_MANS toggle so we deliver disted
#   files from source tree

# Is "egrep == grep -E" always valid? (maybe all a job for configure.ac)
EGREP = egrep
#EGREP = grep -E

# Base configuration and client manpages, always installed
SRC_CONF_PAGES = \
	nut.conf.txt \
	ups.conf.txt \
	upsd.conf.txt \
	upsd.users.txt \
	upsmon.conf.txt \
	upssched.conf.txt

if WITH_MANS
MAN_CONF_PAGES = \
	nut.conf.5 \
	ups.conf.5 \
	upsd.conf.5 \
	upsd.users.5 \
	upsmon.conf.5 \
	upssched.conf.5
endif

man5_MANS = $(MAN_CONF_PAGES)

HTML_CONF_MANS = \
	nut.conf.html \
	ups.conf.html \
	upsd.conf.html \
	upsd.users.html \
	upsmon.conf.html \
	upssched.conf.html

# NOTE: Currently SRC_DRIVERTOOL_PAGES are a separate list to generate
# a linkman-drivertool-names.txt file, but historically remain part of
# MAN/HTML_CLIENT_PAGES in the bigger picture.
SRC_DRIVERTOOL_PAGES = \
	nut-driver-enumerator.txt \
	upsdrvctl.txt \
	upsdrvsvcctl.txt

SRC_CLIENT_PAGES = \
	$(SRC_DRIVERTOOL_PAGES) \
	nutupsdrv.txt \
	upsc.txt \
	upscmd.txt \
	upsd.txt \
	upslog.txt \
	upsmon.txt \
	upsrw.txt \
	upssched.txt

if WITH_MANS
MAN_CLIENT_PAGES = \
	nutupsdrv.8 \
	nut-driver-enumerator.8 \
	upsc.8 \
	upscmd.8 \
	upsd.8 \
	upsdrvctl.8 \
	upsdrvsvcctl.8 \
	upslog.8 \
	upsmon.8 \
	upsrw.8 \
	upssched.8
endif

man8_MANS = $(MAN_CLIENT_PAGES)

HTML_CLIENT_MANS = \
	nutupsdrv.html \
	nut-driver-enumerator.html \
	upsc.html \
	upscmd.html \
	upsd.html \
	upsdrvctl.html \
	upsdrvsvcctl.html \
	upslog.html \
	upsmon.html \
	upsrw.html \
	upssched.html

SRC_TOOL_PAGES = nut-scanner.txt nut-recorder.txt

if WITH_MANS
MAN_TOOL_PAGES = nut-scanner.8 nut-recorder.8
endif

man8_MANS += $(MAN_TOOL_PAGES)

HTML_TOOL_MANS = nut-scanner.html nut-recorder.html

# CGI (--with-cgi) related manpages
SRC_CGI_PAGES = \
	hosts.conf.txt \
	upsset.conf.txt \
	upsstats.html.txt \
	upsset.cgi.txt \
	upsstats.cgi.txt \
	upsimage.cgi.txt

if WITH_MANS
MAN5_CGI_PAGES = \
	hosts.conf.5 \
	upsset.conf.5 \
	upsstats.html.5

MAN8_CGI_PAGES = \
	upsset.cgi.8 \
	upsstats.cgi.8 \
	upsimage.cgi.8
endif

if WITH_CGI
man5_MANS += $(MAN5_CGI_PAGES)
man8_MANS += $(MAN8_CGI_PAGES)
endif

HTML_CGI_MANS = \
	hosts.conf.html \
	upsset.conf.html \
	upsstats.html.html \
	upsset.cgi.html \
	upsstats.cgi.html \
	upsimage.cgi.html


# Development (--with-dev) related manpages
SRC_DEV_PAGES = \
	upsclient.txt \
	upscli_add_host_cert.txt \
	upscli_cleanup.txt \
	upscli_connect.txt \
	upscli_disconnect.txt \
	upscli_fd.txt \
	upscli_get.txt \
	upscli_init.txt \
	upscli_list_next.txt \
	upscli_list_start.txt \
	upscli_readline.txt \
	upscli_sendline.txt \
	upscli_splitaddr.txt \
	upscli_splitname.txt \
	upscli_ssl.txt \
	upscli_strerror.txt \
	upscli_upserror.txt \
	libnutclient.txt \
	libnutclient_commands.txt \
	libnutclient_devices.txt \
	libnutclient_general.txt \
	libnutclient_misc.txt \
	libnutclient_tcp.txt \
	libnutclient_variables.txt \
	nutscan.txt \
	nutscan_scan_snmp.txt \
	nutscan_scan_usb.txt \
	nutscan_scan_xml_http_range.txt \
	nutscan_scan_nut.txt \
	nutscan_scan_avahi.txt \
	nutscan_scan_ipmi.txt \
	nutscan_scan_eaton_serial.txt \
	nutscan_display_ups_conf.txt \
	nutscan_display_parsable.txt \
	nutscan_cidr_to_ip.txt \
	nutscan_new_device.txt \
	nutscan_free_device.txt \
	nutscan_add_option_to_device.txt \
	nutscan_add_device_to_device.txt \
	nutscan_init.txt \
	nutscan_get_serial_ports_list.txt \
	libupsclient-config.txt \
	skel.txt

if WITH_MANS
# NOTE: nutclient_*.3 has no source counterpart (libnutclient_*.txt)

LIBNUTCLIENT_MISC_DEPS= \
	nutclient_authenticate.3 \
	nutclient_logout.3 \
	nutclient_device_login.3 \
	nutclient_get_device_num_logins.3 \
	nutclient_device_master.3 \
	nutclient_device_forced_shutdown.3

$(LIBNUTCLIENT_MISC_DEPS): libnutclient_misc.3
	touch $@

LIBNUTCLIENT_TCP_DEPS= \
	nutclient_tcp_create_client.3 \
	nutclient_tcp_disconnect.3 \
	nutclient_tcp_get_timeout.3 \
	nutclient_tcp_is_connected.3 \
	nutclient_tcp_reconnect.3 \
	nutclient_tcp_set_timeout.3

$(LIBNUTCLIENT_TCP_DEPS): libnutclient_tcp.3
	touch $@

LIBNUTCLIENT_GENERAL_DEPS= \
	nutclient_destroy.3

$(LIBNUTCLIENT_GENERAL_DEPS): libnutclient_general.3
	touch $@

LIBNUTCLIENT_VARIABLES_DEPS= \
	nutclient_get_device_rw_variables.3 \
	nutclient_get_device_variable_description.3 \
	nutclient_get_device_variables.3 \
	nutclient_get_device_variable_values.3 \
	nutclient_has_device_variable.3 \
	nutclient_set_device_variable_value.3 \
	nutclient_set_device_variable_values.3

$(LIBNUTCLIENT_VARIABLES_DEPS): libnutclient_variables.3
	touch $@

LIBNUTCLIENT_COMMANDS_DEPS= \
	nutclient_execute_device_command.3 \
	nutclient_get_device_command_description.3 \
	nutclient_get_device_commands.3 \
	nutclient_has_device_command.3

$(LIBNUTCLIENT_COMMANDS_DEPS): libnutclient_commands.3
	touch $@

LIBNUTCLIENT_DEVICES_DEPS= \
	nutclient_get_device_description.3 \
	nutclient_get_devices.3 \
	nutclient_has_device.3

$(LIBNUTCLIENT_DEVICES_DEPS): libnutclient_devices.3
	touch $@

MAN3_DEV_PAGES = \
	upsclient.3 \
	upscli_add_host_cert.3 \
	upscli_cleanup.3 \
	upscli_connect.3 \
	upscli_disconnect.3 \
	upscli_fd.3 \
	upscli_get.3 \
	upscli_init.3 \
	upscli_list_next.3 \
	upscli_list_start.3 \
	upscli_readline.3 \
	upscli_readline_timeout.3 \
	upscli_sendline.3 \
	upscli_sendline_timeout.3 \
	upscli_splitaddr.3 \
	upscli_splitname.3 \
	upscli_ssl.3 \
	upscli_strerror.3 \
	upscli_upserror.3 \
	libnutclient.3 \
	libnutclient_commands.3 \
	$(LIBNUTCLIENT_COMMANDS_DEPS) \
	libnutclient_devices.3 \
	$(LIBNUTCLIENT_DEVICES_DEPS) \
	libnutclient_general.3 \
	$(LIBNUTCLIENT_GENERAL_DEPS) \
	libnutclient_misc.3 \
	$(LIBNUTCLIENT_MISC_DEPS) \
	libnutclient_tcp.3 \
	$(LIBNUTCLIENT_TCP_DEPS) \
	libnutclient_variables.3 \
	$(LIBNUTCLIENT_VARIABLES_DEPS) \
	nutscan.3 \
	nutscan_scan_snmp.3 \
	nutscan_scan_usb.3 \
	nutscan_scan_xml_http_range.3 \
	nutscan_scan_nut.3 \
	nutscan_scan_avahi.3 \
	nutscan_scan_ipmi.3 \
	nutscan_scan_eaton_serial.3 \
	nutscan_display_ups_conf.3 \
	nutscan_display_parsable.3 \
	nutscan_cidr_to_ip.3 \
	nutscan_new_device.3 \
	nutscan_free_device.3 \
	nutscan_add_option_to_device.3 \
	nutscan_add_device_to_device.3 \
	nutscan_get_serial_ports_list.3 \
	nutscan_init.3

upscli_readline_timeout.3: upscli_readline.3
	touch $@

upscli_sendline_timeout.3: upscli_sendline.3
	touch $@

MAN1_DEV_PAGES = \
	libupsclient-config.1
endif

if WITH_DEV
man3_MANS = $(MAN3_DEV_PAGES)

if !WITH_PKG_CONFIG
man1_MANS = $(MAN1_DEV_PAGES)
endif
# WITH_DEV
endif

HTML_DEV_MANS = \
	upsclient.html \
	upscli_add_host_cert.html \
	upscli_cleanup.html \
	upscli_connect.html \
	upscli_disconnect.html \
	upscli_fd.html \
	upscli_get.html \
	upscli_init.html \
	upscli_list_next.html \
	upscli_list_start.html \
	upscli_readline.html \
	upscli_sendline.html \
	upscli_splitaddr.html \
	upscli_splitname.html \
	upscli_ssl.html \
	upscli_strerror.html \
	upscli_upserror.html \
	libnutclient.html \
	libnutclient_commands.html \
	libnutclient_devices.html \
	libnutclient_general.html \
	libnutclient_misc.html \
	libnutclient_tcp.html \
	libnutclient_variables.html \
	nutscan.html \
	nutscan_scan_snmp.html \
	nutscan_scan_usb.html \
	nutscan_scan_xml_http_range.html \
	nutscan_scan_nut.html \
	nutscan_scan_avahi.html \
	nutscan_scan_ipmi.html \
	nutscan_scan_eaton_serial.html \
	nutscan_display_ups_conf.html \
	nutscan_display_parsable.html \
	nutscan_cidr_to_ip.html \
	nutscan_new_device.html \
	nutscan_free_device.html \
	nutscan_add_option_to_device.html \
	nutscan_add_device_to_device.html \
	nutscan_get_serial_ports_list.html \
	nutscan_init.html \
	libupsclient-config.html \
	skel.html


# Drivers related manpages

# (--with-drivers=...)
if SOME_DRIVERS
man8_MANS += $(DRIVER_MAN_LIST)

else

# (--with-serial)
SRC_SERIAL_PAGES = \
	al175.txt	\
	apcsmart.txt	\
	apcsmart-old.txt	\
	bcmxcp.txt 	\
	belkin.txt 	\
	belkinunv.txt	\
	bestfortress.txt	\
	bestuferrups.txt	\
	bestups.txt 	\
	bestfcom.txt	\
	blazer-common.txt	\
	blazer_ser.txt	\
	clone.txt \
	dummy-ups.txt	\
	etapro.txt	\
	everups.txt	\
	gamatronic.txt	\
	genericups.txt	\
	isbmex.txt	\
	ivtscd.txt	\
	liebert.txt	\
	liebert-esp2.txt	\
	masterguard.txt	\
	metasys.txt	\
	mge-shut.txt	\
	mge-utalk.txt	\
	oneac.txt		\
	microdowell.txt	\
	microsol-apc.txt	\
	nutdrv_siemens_sitop.txt	\
	optiups.txt	\
	powercom.txt 	\
	powerpanel.txt	\
	rhino.txt		\
	riello_ser.txt	\
	safenet.txt	\
	solis.txt		\
	tripplite.txt	\
	tripplitesu.txt	\
	upscode2.txt	\
	victronups.txt	\
	apcupsd-ups.txt

if WITH_MANS
MAN_SERIAL_PAGES = \
	al175.8	\
	apcsmart.8	\
	apcsmart-old.8	\
	bcmxcp.8 	\
	belkin.8 	\
	belkinunv.8	\
	bestfortress.8	\
	bestuferrups.8	\
	bestups.8 	\
	bestfcom.8	\
	blazer_ser.8	\
	clone.8 \
	dummy-ups.8	\
	etapro.8	\
	everups.8	\
	gamatronic.8	\
	genericups.8	\
	isbmex.8	\
	ivtscd.8	\
	liebert.8	\
	liebert-esp2.8	\
	masterguard.8	\
	metasys.8	\
	mge-shut.8	\
	mge-utalk.8	\
	oneac.8		\
	microdowell.8	\
	microsol-apc.8	\
	nutdrv_siemens_sitop.8	\
	optiups.8	\
	powercom.8 	\
	powerpanel.8	\
	rhino.8		\
	riello_ser.8	\
	safenet.8	\
	solis.8		\
	tripplite.8	\
	tripplitesu.8	\
	upscode2.8	\
	victronups.8	\
	apcupsd-ups.8
endif

if WITH_SERIAL
man8_MANS +=  $(MAN_SERIAL_PAGES)
endif

HTML_SERIAL_MANS = \
	al175.html	\
	apcsmart.html	\
	apcsmart-old.html	\
	bcmxcp.html 	\
	belkin.html 	\
	belkinunv.html	\
	bestfortress.html	\
	bestuferrups.html	\
	bestups.html 	\
	bestfcom.html	\
	blazer_ser.html	\
	clone.html \
	dummy-ups.html	\
	etapro.html	\
	everups.html	\
	gamatronic.html	\
	genericups.html	\
	isbmex.html	\
	ivtscd.html	\
	liebert.html	\
	liebert-esp2.html	\
	masterguard.html	\
	metasys.html	\
	mge-shut.html	\
	mge-utalk.html	\
	oneac.html		\
	microdowell.html	\
	microsol-apc.html	\
	nutdrv_siemens_sitop.html	\
	optiups.html	\
	powercom.html 	\
	powerpanel.html	\
	rhino.html		\
	riello_ser.html	\
	safenet.html	\
	solis.html		\
	tripplite.html	\
	tripplitesu.html	\
	upscode2.html	\
	victronups.html	\
	apcupsd-ups.html

# (--with-snmp)
SRC_SNMP_PAGES = snmp-ups.txt
if WITH_MANS
MAN_SNMP_PAGES = snmp-ups.8
endif

if WITH_SNMP
man8_MANS += $(MAN_SNMP_PAGES)
endif

HTML_SNMP_MANS = snmp-ups.html

# (--with-usb)
SRC_USB_LIBUSB_PAGES = \
	bcmxcp_usb.txt \
	blazer-common.txt	\
	blazer_usb.txt	\
	nutdrv_atcl_usb.txt \
	richcomm_usb.txt \
	riello_usb.txt	\
	tripplite_usb.txt \
	usbhid-ups.txt

if WITH_MANS
MAN_USB_LIBUSB_PAGES = \
	bcmxcp_usb.8 \
	blazer_usb.8 \
	nutdrv_atcl_usb.8 \
	richcomm_usb.8 \
	riello_usb.8	\
	tripplite_usb.8 \
	usbhid-ups.8
endif

if WITH_USB
man8_MANS += $(MAN_USB_LIBUSB_PAGES)
endif

HTML_USB_LIBUSB_MANS = \
	bcmxcp_usb.html \
	blazer_usb.html	\
	nutdrv_atcl_usb.html \
	richcomm_usb.html \
	riello_usb.html	\
	tripplite_usb.html \
	usbhid-ups.html

# (--with-serial / --with-usb)
SRC_SERIAL_USB_PAGES = \
	nutdrv_qx.txt

if WITH_MANS
MAN_SERIAL_USB_PAGES = \
	nutdrv_qx.8
endif

if WITH_SERIAL
man8_MANS += $(MAN_SERIAL_USB_PAGES)
else
if WITH_USB
man8_MANS += $(MAN_SERIAL_USB_PAGES)
endif
endif

HTML_SERIAL_USB_MANS = \
	nutdrv_qx.html

# (--with-neon)
SRC_NETXML_PAGES = netxml-ups.txt
if WITH_MANS
MAN_NETXML_PAGES = netxml-ups.8
endif

if WITH_NEON
man8_MANS += $(MAN_NETXML_PAGES)
endif

HTML_NETXML_MANS = netxml-ups.html

# (--with-powerman)
SRC_POWERMAN_PAGES = powerman-pdu.txt
if WITH_MANS
MAN_POWERMAN_PAGES = powerman-pdu.8
endif

if WITH_LIBPOWERMAN
man8_MANS += $(MAN_POWERMAN_PAGES)
endif

HTML_POWERMAN_MANS = powerman-pdu.html

# (--with-ipmi)
SRC_IPMIPSU_PAGES = nut-ipmipsu.txt
if WITH_MANS
MAN_IPMIPSU_PAGES = nut-ipmipsu.8
endif

if WITH_IPMI
man8_MANS += $(MAN_IPMIPSU_PAGES)
endif

HTML_IPMIPSU_MANS = nut-ipmipsu.html

SRC_MACOSX_PAGES = macosx-ups.txt
if WITH_MANS
MAN_MACOSX_PAGES = macosx-ups.8
endif

if WITH_MACOSX
man8_MANS += $(MAN_MACOSX_PAGES)
endif

HTML_MACOSX_MANS = macosx-ups.html

SRC_MODBUS_PAGES = phoenixcontact_modbus.txt \
	generic_modbus.txt \
	huawei-ups2000.txt \
	socomec_jbus.txt   \
	adelsystem_cbi.txt
if WITH_MANS
MAN_MODBUS_PAGES = phoenixcontact_modbus.8 \
	generic_modbus.8 \
	huawei-ups2000.8 \
	socomec_jbus.8   \
	adelsystem_cbi.8
endif

if WITH_MODBUS
man8_MANS += $(MAN_MODBUS_PAGES)
endif

HTML_MODBUS_MANS = phoenixcontact_modbus.html \
	generic_modbus.html \
	huawei-ups2000.html \
	socomec_jbus.html   \
	adelsystem_cbi.html

SRC_LINUX_I2C_PAGES = asem.txt pijuice.txt
if WITH_MANS
MAN_LINUX_I2C_PAGES = asem.8 pijuice.8
endif

if WITH_LINUX_I2C
man8_MANS += $(MAN_LINUX_I2C_PAGES)
endif

HTML_LINUX_I2C_MANS = asem.html pijuice.html

# SOME_DRIVERS
endif

MAN_MANS =
if WITH_MANS
MAN_MANS += \
	$(MAN_CONF_PAGES) \
	$(MAN_CLIENT_PAGES) \
	$(MAN_TOOL_PAGES) \
	$(MAN5_CGI_PAGES) \
	$(MAN8_CGI_PAGES) \
	$(MAN1_DEV_PAGES) \
	$(MAN3_DEV_PAGES) \
	$(MAN_SERIAL_PAGES) \
	$(MAN_SNMP_PAGES) \
	$(MAN_USB_LIBUSB_PAGES) \
	$(MAN_SERIAL_USB_PAGES) \
	$(MAN_NETXML_PAGES) \
	$(MAN_POWERMAN_PAGES) \
	$(MAN_IPMIPSU_PAGES) \
	$(MAN_MACOSX_PAGES) \
	$(MAN_MODBUS_PAGES) \
	$(MAN_LINUX_I2C_PAGES)
endif

SRC_DRIVERS_PAGES = \
	$(SRC_SERIAL_PAGES) \
	$(SRC_SNMP_PAGES) \
	$(SRC_USB_LIBUSB_PAGES) \
	$(SRC_SERIAL_USB_PAGES) \
	$(SRC_NETXML_PAGES) \
	$(SRC_POWERMAN_PAGES) \
	$(SRC_IPMIPSU_PAGES) \
	$(SRC_MACOSX_PAGES) \
	$(SRC_MODBUS_PAGES) \
	$(SRC_LINUX_I2C_PAGES)

# distribute everything, even those not installed by default
# Note that 'dist' target requires AsciiDoc!
SRC_ALL_PAGES = \
	$(SRC_CONF_PAGES) \
	$(SRC_CLIENT_PAGES) \
	$(SRC_TOOL_PAGES) \
	$(SRC_CGI_PAGES) \
	$(SRC_DEV_PAGES) \
	$(SRC_DRIVERS_PAGES)

EXTRA_DIST = \
	$(SRC_ALL_PAGES) \
	$(MAN_MANS) \
	asciidoc.conf

if ! WITH_MANS
if ! SKIP_MANS
# Cause "make dist" to fail, unless caller (like the stack of distcheck-dmf)
# runs ./configure --with-doc=skip (or --with-doc=man=skip specifically)
EXTRA_DIST += dist
dist:
	@echo "ERROR: Manpage building was disabled by configure script, and these pages are required for our proper 'make dist'" >&2 ; false
endif
endif

# For builds done from dist'ed sources, there may be a conflict of timestamps
# between original *.txt files and pre-built manpages etc. leading to skipping
# of manpage re-generation even if that activity is possible and requested.
# Possibly a cleaner, but less portable, solution would be to touch the
# generated files to long ago. Current solution assumes good valid clocks :)
dist-hook:
	@echo "Fix up manpage source timestamps" && cd $(distdir) && touch $(SRC_ALL_PAGES)

HTML_MANS = \
	$(HTML_CONF_MANS) \
	$(HTML_CLIENT_MANS) \
	$(HTML_TOOL_MANS) \
	$(HTML_CGI_MANS) \
	$(HTML_DEV_MANS) \
	$(HTML_SERIAL_MANS) \
	$(HTML_SNMP_MANS) \
	$(HTML_USB_LIBUSB_MANS) \
	$(HTML_SERIAL_USB_MANS) \
	$(HTML_NETXML_MANS) \
	$(HTML_POWERMAN_MANS) \
	$(HTML_IPMIPSU_MANS) \
	$(HTML_MACOSX_MANS) \
	$(HTML_MODBUS_MANS) \
	$(HTML_LINUX_I2C_MANS)

# Note: target documents, except nutupsdrv.txt itself, start the
# list of drivers with `- linkman:nutupsdrv[8]` entry
# To regenerate these files, do `make distclean` first
LINKMAN_INCLUDE_GENERATED = linkman-driver-names.txt linkman-drivertool-names.txt
LINKMAN_INCLUDE_CONSUMERS = index.txt upsd.txt nutupsdrv.txt

linkman-driver-names.txt:
	@if test x"$(srcdir)" != x"$(builddir)" ; then \
	    if ! test -s "$(builddir)/$@" && test -s "$(srcdir)/$(@F)" ; then \
	        ln -fs "$(srcdir)/$(@F)" "$(builddir)/" ; \
	    fi ; \
	 fi
	@if test -s "$@" ; then exit 0 ; fi ; \
	 (LC_ALL=C; LANG=C; export LC_ALL LANG; \
	  for F in $(SRC_DRIVERS_PAGES) ; do echo "$$F" ; done \
	    | grep -vE '^nutupsdrv\.txt$$' \
	    | sort -n | uniq \
	    | sed 's,^\(.*\)\.txt$$,- linkman:\1[8],' ; \
	 ) > "$@"

linkman-drivertool-names.txt:
	@if test x"$(srcdir)" != x"$(builddir)" ; then \
	    if ! test -s "$(builddir)/$@" && test -s "$(srcdir)/$(@F)" ; then \
	        ln -fs "$(srcdir)/$(@F)" "$(builddir)/" ; \
	    fi ; \
	 fi
	@if test -s "$@" ; then exit 0 ; fi ; \
	 (LC_ALL=C; LANG=C; export LC_ALL LANG; \
	  for F in $(SRC_DRIVERTOOL_PAGES) ; do echo "$$F" ; done \
	    | sort -n | uniq \
	    | sed 's,^\(.*\)\.txt$$,- linkman:\1[8],' ; \
	 ) > "$@"

# Dependencies are about particular filenames, since over time
# we might have several use-cases for LINKMAN_INCLUDE_GENERATED:
$(LINKMAN_INCLUDE_CONSUMERS): linkman-driver-names.txt linkman-drivertool-names.txt

# These files are generated when we build from git source so not tracked in
# git, and not part of tarball (to be in builddir) - so not in EXTRA_DIST.
DISTCLEANFILES = $(LINKMAN_INCLUDE_GENERATED)

all:

all-html html-man: $(HTML_MANS) index.html

# Have a way to build all man pages, not just those that fit currently
# configured drivers, daemons, developer aspect, etc.
all-man man-man: $(MAN_MANS)

if WITH_MANS
if ! SKIP_MANS
check-local: check-man
else
check-local: check-man-txt check-man-pages
	@echo "Man-page generation was SKIPPED per user request, so pregenerated pages were sanity-checked (if any)" >&2
endif
else
check-local: check-man-txt check-man-pages
	@echo "Man-page generation was not done, so pregenerated pages were sanity-checked (if any)" >&2
endif

check-man: check-man-txt check-man-pages check-html-man

# the "for" loops might better use $^ but it might be not portable
check-man-html: check-html-man

check-html-man: $(HTML_MANS)
	@FAILED=""; CHECKED=0; LANG=C; LC_ALL=C; export LANG; export LC_ALL; \
	for F in $(HTML_MANS) ; do \
	    CHECKED="`expr $$CHECKED + 1`"; \
	    test -s "$$F" && { file "$$F" | $(EGREP) -i '(XML|HTML.*document)' > /dev/null ; } || FAILED="$$FAILED $$F" ; \
	done; if test -n "$$FAILED" ; then \
	    echo "FAILED HTML-man sanity check for:$$FAILED" >&2 ; file $$FAILED >&2 ; exit 1; \
	fi; echo "PASSED HTML-man sanity check (checked $$CHECKED files)"; exit 0

# Note: many man-pages here have code samples and are mis-identified as C code
check-man-page: check-man-pages

# Man-pages may be pre-generated (srcdir), or re-built (builddir)
check-man-pages: $(MAN_MANS)
	@FAILED=""; CHECKED=0; LANG=C; LC_ALL=C; export LANG; export LC_ALL; \
	for F in $(MAN_MANS) ; do \
	    CHECKED="`expr $$CHECKED + 1`"; \
	    ( test -s "$(abs_srcdir)/$$F" && { file "$(abs_srcdir)/$$F" | $(EGREP) -i '(roff.* input|C source|ASCII text)' > /dev/null ; } ) || \
	    ( test -s "$(abs_builddir)/$$F" && { file "$(abs_builddir)/$$F" | $(EGREP) -i '(roff.* input|C source|ASCII text)' > /dev/null ; } ) || \
	    FAILED="$$FAILED $$F" ; \
	done; if test -n "$$FAILED" ; then \
	    echo "FAILED man-page sanity check for:$$FAILED" >&2 ; \
	    ( echo "SRCDIR:"; cd "$(abs_srcdir)/" && file $$FAILED ; \
	      echo "BUILDDIR:"; cd "$(abs_builddir)/" && file $$FAILED ; \
	    ) >&2 ; exit 1; \
	fi; echo "PASSED man-page sanity check (checked $$CHECKED files)"; exit 0

check-man-source: check-man-txt

# Note: (GNU) make can helpfully add VPATH to the short source filenames
# which we had listed above, so the "case" below handles two possibilities
check-man-txt: $(SRC_ALL_PAGES)
	@FAILED=""; CHECKED=0; LANG=C; LC_ALL=C; export LANG; export LC_ALL; \
	( cd $(abs_srcdir) ) || exit; \
	for F in $(SRC_ALL_PAGES) ; do \
	    CHECKED="`expr $$CHECKED + 1`"; \
	    case "$$F" in \
	        */*) ;; \
	        *) F="$(abs_srcdir)/$$F" ;; \
	    esac ; \
	    test -s "$$F" && { file "$$F" | $(EGREP) -i '(ASCII|UTF-8|Unicode|ISO-8859|English).* text' > /dev/null ; } || FAILED="$$FAILED $$F" ; \
	done; if test -n "$$FAILED" ; then \
	    echo "FAILED man-source sanity check for:$$FAILED" >&2 ; file $$FAILED >&2 ; exit 1; \
	fi; echo "PASSED man-source sanity check (checked $$CHECKED files)"; exit 0

CLEANFILES = *-spellchecked

SUFFIXES = .txt .html .1 .3 .5 .8

# For builds with allowed installation of prebuild man pages, check that
# they exist in sources (make would pull them automatically as a fallback
# from failed lookup in build products). For builds that require rebuild
# of man pages, abort with error if build product is missing.
if DOC_INSTALL_DISTED_MANS
SRC_PREBUILT_CLAUSE=|| [ -r "$(srcdir)/`basename $@`" ]
else
SRC_PREBUILT_CLAUSE=
endif

if HAVE_ASCIIDOC

CLEANFILES += *.1 *.3 *.5 *.8 *.xml *.html *.pdf

# Working around a2x not friendly to parallelized runs.
# See more details in the main NUT docs/Makefile.am
DOCBUILD_BEGIN = { \
    if test -n "$${A2X_OUTDIR}" && test "$${A2X_OUTDIR}" != '.' ; then \
        rm -rf "./$${A2X_OUTDIR}" || true ; \
        test -d "$@" && rm -rf "$@" || true ; \
        mkdir -p "./$${A2X_OUTDIR}" || exit ; \
        for F in $(LINKMAN_INCLUDE_GENERATED) ; do \
            if [ -s "./$$F" ] ; then ln -f -s "../../$$F" "./$${A2X_OUTDIR}/" ; else \
            if [ -s "$(abs_srcdir)/$$F" ] ; then ln -f -s "$(abs_srcdir)/$$F" "./$${A2X_OUTDIR}/" ; fi ; fi ; \
        done ; \
    else A2X_OUTDIR='.' ; fi; \
    if test -s "${builddir}/docbook-xsl.css" \
    && test -r "${builddir}/docbook-xsl.css" \
    && ! test -w "${builddir}/docbook-xsl.css" \
    ; then chmod u+w "${builddir}/docbook-xsl.css" ; fi ; \
    chmod -R u+w "./$${A2X_OUTDIR}" || true ; \
    if test x"$(srcdir)" != x"$(builddir)" ; then \
        if ! test -s "$(builddir)/$<" && test -s "$(srcdir)/`basename $<`" ; then \
            ln -fs "$(srcdir)/`basename $<`" "$(builddir)/" ; \
        fi ; \
    fi ; \
    A2X_VERBOSE="$(ASCIIDOC_VERBOSE)"; if [ "$(V)" = 1 ]; then A2X_VERBOSE="--verbose"; fi; \
}

# Note that documents with sub-pages (see LIBNUTCLIENT_*_DEPS above)
# may generate multiple files in one go... so we move "*" and hope
# for no required hidden files (or would have to `find` them all).
DOCBUILD_END = { \
    if test -n "$${A2X_OUTDIR}" && test "$${A2X_OUTDIR}" != '.' ; then \
        chmod -R u+w "./$${A2X_OUTDIR}" || true ; \
        test -d "$@" && rm -rf "$@" || true ; \
        for F in $(LINKMAN_INCLUDE_GENERATED) ; do \
            rm -f "./$${A2X_OUTDIR}/$$F" || true ; \
        done ; \
        mv -f "./$${A2X_OUTDIR}/$(@F)" ./ || exit ; \
        mv -f "./$${A2X_OUTDIR}/"*.* ./ 2>/dev/null || true ; \
        rm -rf "./$${A2X_OUTDIR}" ; \
    fi ; \
}

### Regarding absolute paths in attributes below: by default asciidoc
### resolves include paths relative to the main document, so while we
### see the relative builddir as "." in the makefile, for included
### data it would mean the source directory where the .txt resides.
.txt.html:
	@A2X_OUTDIR="tmp/man-html.$(@F).$$$$" ; \
	 echo "  DOC-MAN-HTML Generating $@"; \
	 $(DOCBUILD_BEGIN) ; RES=0; \
	 $(ASCIIDOC) --backend=xhtml11 $${A2X_VERBOSE} \
		--attribute localdate="`TZ=UTC date +%Y-%m-%d`" \
		--attribute localtime="`TZ=UTC date +%H:%M:%S`" \
		--attribute nutversion="@PACKAGE_VERSION@" \
		--attribute srcdir="$(abs_srcdir)" \
		--attribute builddir="$(abs_builddir)" \
		-o "$${A2X_OUTDIR}/$(@F)" $< || RES=$$? ; \
	 $(DOCBUILD_END) ; exit $$RES

### Prior to Asciidoc ~8.6.8, the --destination-dir flag didn't seem to affect the location of the intermediate .xml file.
### This parameter is currently required; see docs/Makefile.am for more detail.
A2X_MANPAGE_OPTS = --doctype manpage --format manpage $${A2X_VERBOSE} \
	--xsltproc-opts="--nonet" \
	--attribute mansource="Network UPS Tools" \
	--attribute manversion="@PACKAGE_VERSION@" \
	--attribute manmanual="NUT Manual" \
	--attribute srcdir="$(abs_srcdir)" \
	--attribute builddir="$(abs_builddir)" \
	--destination-dir="$${A2X_OUTDIR}"

.txt.1:
	@A2X_OUTDIR="tmp/man1.$(@F).$$$$" ; \
	 echo "  DOC-MAN  Generating $@"; \
	 $(DOCBUILD_BEGIN) ; RES=0; \
	 $(A2X) $(A2X_MANPAGE_OPTS) $< || RES=$$? ; \
	 $(DOCBUILD_END) ; exit $$RES

.txt.3:
	@A2X_OUTDIR="tmp/man3.$(@F).$$$$" ; \
	 echo "  DOC-MAN  Generating $@"; \
	 $(DOCBUILD_BEGIN) ; RES=0; \
	 $(A2X) $(A2X_MANPAGE_OPTS) $< || RES=$$? ; \
	 $(DOCBUILD_END) ; exit $$RES

.txt.5:
	@A2X_OUTDIR="tmp/man5.$(@F).$$$$" ; \
	 echo "  DOC-MAN  Generating $@"; \
	 $(DOCBUILD_BEGIN) ; RES=0; \
	 $(A2X) $(A2X_MANPAGE_OPTS) $< || RES=$$? ; \
	 $(DOCBUILD_END) ; exit $$RES

.txt.8:
	@A2X_OUTDIR="tmp/man8.$(@F).$$$$" ; \
	 echo "  DOC-MAN  Generating $@"; \
	 $(DOCBUILD_BEGIN) ; RES=0; \
	 $(A2X) $(A2X_MANPAGE_OPTS) $< || RES=$$? ; \
	 $(DOCBUILD_END) ; exit $$RES

else !HAVE_ASCIIDOC

.txt.html:
	@if [ -r "$@" ] $(SRC_PREBUILT_CLAUSE); then \
		echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \
	else \
		echo "Could not find prebuilt $@ manual page." ; \
		echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \
		exit 1; \
	fi

.txt.1:
	@if [ -r "$@" ] $(SRC_PREBUILT_CLAUSE); then \
		echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \
	else \
		echo "Could not find prebuilt $@ manual page." ; \
		echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \
		exit 1; \
	fi

.txt.3:
	@if [ -r "$@" ] $(SRC_PREBUILT_CLAUSE); then \
		echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \
	else \
		echo "Could not find prebuilt $@ manual page." ; \
		echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \
		exit 1; \
	fi

.txt.5:
	@if [ -r "$@" ] $(SRC_PREBUILT_CLAUSE); then \
		echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \
	else \
		echo "Could not find prebuilt $@ manual page." ; \
		echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \
		exit 1; \
	fi

.txt.8:
	@if [ -r "$@" ] $(SRC_PREBUILT_CLAUSE); then \
		echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \
	else \
		echo "Could not find prebuilt $@ manual page." ; \
		echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \
		exit 1; \
	fi

endif !HAVE_ASCIIDOC

# NOTE: Due to portability, we do not use a GNU percent-wildcard extension:
#%-spellchecked: % Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
#	$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@

# NOTE: Portable suffix rules do not allow prerequisites, so we shim them here
# by a wildcard target in case the make implementation can put the two together.
*.txt-spellchecked: Makefile.am $(abs_top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
.txt.txt-spellchecked:
	$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@

spellcheck spellcheck-interactive spellcheck-sortdict:
	$(MAKE) -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC="$(SRC_ALL_PAGES)" SPELLCHECK_DIR="$(srcdir)" $@

MAINTAINERCLEANFILES = Makefile.in .dirstamp

clean-local:
	rm -rf tmp
