#
# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
# Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved.
#
# This file is part of LVM2.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

srcdir = .
top_srcdir = ..
top_builddir = ..

ifeq ($(V),1)
	Q=
else
	Q=@
endif

FSADMMAN = fsadm.8
BLKDEACTIVATEMAN = blkdeactivate.8
DMEVENTDMAN = dmeventd.8
DMFILEMAPDMAN = dmfilemapd.8
LVMETADMAN = lvmetad.8
LVMPOLLDMAN = lvmpolld.8
LVMLOCKDMAN = lvmlockd.8 lvmlockctl.8
CLVMDMAN = clvmd.8
CMIRRORDMAN = cmirrord.8
LVMCACHEMAN = lvmcache.7
LVMTHINMAN = lvmthin.7
LVMDBUSDMAN = lvmdbusd.8
LVMRAIDMAN = lvmraid.7

MAN5=lvm.conf.5
MAN7=lvmsystemid.7 lvmreport.7 
MAN8=lvm.8 lvmconf.8 lvmdump.8 lvm-fullreport.8 lvm-lvpoll.8 \
     lvcreate.8 lvchange.8 lvmconfig.8 lvconvert.8 lvdisplay.8 \
     lvextend.8 lvreduce.8 lvremove.8 lvrename.8 lvresize.8 lvs.8 \
     lvscan.8 pvchange.8 pvck.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \
     pvresize.8 pvs.8 pvscan.8 vgcfgbackup.8 vgcfgrestore.8 vgchange.8 \
     vgck.8 vgcreate.8 vgconvert.8 vgdisplay.8 vgexport.8 vgextend.8 \
     vgimport.8 vgimportclone.8 vgmerge.8 vgmknodes.8 vgreduce.8 vgremove.8 \
     vgrename.8 vgs.8 vgscan.8 vgsplit.8 \
     lvmsar.8 lvmsadc.8 lvmdiskscan.8
MAN8SO=lvm-config.8 lvm-dumpconfig.8
MAN8DM=dmsetup.8 dmstats.8
MAN8CLUSTER=
MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8

ifeq ($(MAKECMDGOALS),all_man)
  MAN_ALL="yes"
endif

ifeq ($(MAKECMDGOALS),install_all_man)
  MAN_ALL="yes"
endif

ifeq ($(MAN_ALL),"yes")
  MAN8+=$(FSADMMAN) $(LVMETADMAN) $(LVMPOLLDMAN) $(LVMLOCKDMAN) $(LVMDBUSDMAN)
  MAN8DM+=$(BLKDEACTIVATEMAN) $(DMEVENTDMAN) $(DMFILEMAPDMAN)
  MAN8CLUSTER+=$(CLVMDMAN) $(CMIRRORDMAN)
else
  ifeq ("yes", "yes")
    MAN8+=$(FSADMMAN)
  endif

  ifeq ("no", "yes")
    MAN8+=$(LVMDBUSDMAN)
  endif

  ifeq ("no", "yes")
    MAN8+=$(LVMETADMAN)
  endif

  ifeq ("no", "yes")
    MAN8+=$(LVMPOLLDMAN)
  endif

  ifeq ("no", "yes")
    MAN8+=$(LVMLOCKDMAN)
  endif

  ifeq ("yes", "yes")
    MAN8DM+=$(BLKDEACTIVATEMAN)
  endif

  ifeq ("yes", "yes")
    MAN8DM+=$(DMEVENTDMAN)
  endif

  ifeq ("no", "yes")
    MAN8DM+=$(DMFILEMAPDMAN)
  endif

  ifneq ("none", "none")
    MAN8CLUSTER+=$(CLVMDMAN)
  endif

  ifeq ("no", "yes")
    MAN8CLUSTER+=$(CMIRRORDMAN)
  endif
endif

MAN7+=$(LVMCACHEMAN) $(LVMTHINMAN) $(LVMRAIDMAN)
MAN5DIR=$(mandir)/man5
MAN7DIR=$(mandir)/man7
MAN8DIR=$(mandir)/man8

MANGENERATOR=$(top_builddir)/tools/man-generator
TESTMAN=test.gen

include $(top_builddir)/make.tmpl

CLEAN_TARGETS+=$(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8:%.8=%.8_gen) $(MAN8CLUSTER) \
	$(MAN8SYSTEMD_GENERATORS) $(MAN8DM) $(TESTMAN)
DISTCLEAN_TARGETS+=$(FSADMMAN) $(BLKDEACTIVATEMAN) $(DMEVENTDMAN) \
	$(LVMETADMAN) $(LVMPOLLDMAN) $(LVMLOCKDMAN) $(CLVMDMAN) $(CMIRRORDMAN) \
	$(LVMCACHEMAN) $(LVMTHINMAN) $(LVMDBUSDMAN) $(LVMRAIDMAN) \
	$(DMFILEMAPDMAN)

all: man device-mapper

.PHONY: man install_man5 install_man7 install_man8 pregenerated_man

device-mapper: $(MAN8DM)

man: $(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS)

all_man: man

$(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8DM) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS): Makefile

# Test whether or not the man page generator works
$(TESTMAN): $(MANGENERATOR) Makefile
	- $(MANGENERATOR) --primary lvmconfig > $@

SEE_ALSO=$(srcdir)/see_also.end

.PRECIOUS: %.8_gen

%.8_gen: $(srcdir)/%.8_des $(srcdir)/%.8_end $(MANGENERATOR) $(TESTMAN)
	$(Q)set -e ; ( \
	    if [ ! -s $(TESTMAN) ] ; then \
		cat $(srcdir)/$(@:%.8_gen=%.8_pregen) ; \
	    else \
		MANCMD=$(basename $@) && \
		$(MANGENERATOR) --primary $$MANCMD $< && \
		$(MANGENERATOR) --secondary $$MANCMD && \
		cat $(srcdir)/$(basename $@).8_end && \
		cat $(SEE_ALSO) ; \
	    fi \
	) > $@

define SUBSTVARS
$(Q)$(SED) -e "s+#VERSION#+$(LVM_VERSION)+" \
	-e "s+#DEFAULT_SYS_DIR#+$(DEFAULT_SYS_DIR)+" \
	-e "s+#DEFAULT_ARCHIVE_DIR#+$(DEFAULT_ARCHIVE_DIR)+" \
	-e "s+#DEFAULT_BACKUP_DIR#+$(DEFAULT_BACKUP_DIR)+" \
	-e "s+#DEFAULT_PROFILE_DIR#+$(DEFAULT_PROFILE_DIR)+" \
	-e "s+#DEFAULT_CACHE_DIR#+$(DEFAULT_CACHE_DIR)+" \
	-e "s+#DEFAULT_LOCK_DIR#+$(DEFAULT_LOCK_DIR)+" \
	-e "s+#CLVMD_PATH#+$(exec_prefix)/clvmd+" \
	-e "s+#LVM_PATH#+$(exec_prefix)/lvm+" \
	-e "s+#DEFAULT_RUN_DIR#+$(DEFAULT_RUN_DIR)+" \
	-e "s+#DEFAULT_PID_DIR#+$(DEFAULT_PID_DIR)+" \
	-e "s+#SYSTEMD_GENERATOR_DIR#+$(SYSTEMD_GENERATOR_DIR)+" \
	-e "s+#DEFAULT_MANGLING#+$(DEFAULT_MANGLING)+" $< > $@
endef

# Escape any '-':
#
# - multiple (>= 2)
# - in ' -'
# - in ranges
# - in middle of options (e.g. '--use-policies') and their arguments
# - in symbolic use (e.g. '->')
# - in "$vg-$lv"
# - in single one in '\\f.-'
define ESCAPEHYPHENS
$(Q)$(SED) -i -e "s+\([ [:alpha:]]\)-\{7\}+\1\\\-\\\-\\\-\\\-\\\-\\\-\\\-+g" \
	  -e "s+\([ [:alpha:]]\)-\{6\}+\1\\\-\\\-\\\-\\\-\\\-\\\-+g" \
	  -e "s+\([ [:alpha:]]\)-\{5\}+\1\\\-\\\-\\\-\\\-\\\-+g" \
	  -e "s+\([ [:alpha:]]\)-\{4\}+\1\\\-\\\-\\\-\\\-+g" \
	  -e "s+\([ [:alpha:]]\)-\{3\}+\1\\\-\\\-\\\-+g" \
	  -e "s+\([ [:alpha:]]\)-\{2\}+\1\\\-\\\-+g" \
	  -e "s+\([^\]\)-\([[:alnum:]\?]\)+\1\\\-\2+g" \
	  -e "s+ --+\\\-\\\-+g" \
	  -e "s+|-|+|\\\-|+g" \
	  -e "s+|-\\\-+\\\-\\\-+g" \
	  -e "s+ -\"+ \\\-\"+g" \
	  -e "s+'--'+'\\\-\\\-'+g" \
	  -e "s+^--+\\\-\\\-+g" \
	  -e "s+\([[:alnum:]]\) - \([[:alnum:]]\)+\1 \\\- \2+g" \
	  -e "s+\(<\)-+\1\\\-+g" \
	  -e "s+[^\\]-\(>\)+\\\-\1+g" \
	  -e "s+\([[:alnum:]]\{2,\}\)\\\-\([[:alnum:]]\{2,\}\)+\1-\2+g" \
	  -e "s+\(\\\-\\\-[[:alnum:]]\{2,\}\)-+\1\\\-+g" \
	  -e "s+\(lvm2\-activation\)+lvm2\\\-activation+" \
	  -e "s+\([^\\]\)-pool+\1\\\-pool+g" \
	  -e "s+\([[:digit:]]\)-\([[:digit:]]\)+\1\\\-\2+g" \
	  -e "s+\\\-git+\-git+g" \
	  -e "s+\(vg.*\)\-lv+\1\\\-lv+g" \
	  -e "s+\([[:digit:]]\{4\}\)\\\-\([[:digit:]]\{2\}\)\\\-\([[:digit:]]\{2\}\)+\1-\2-\3+g" $@
endef

%.5: $(srcdir)/%.5_main
	@echo "    [MAN] $@"
	$(Q) $(SUBSTVARS)
	$(Q) $(ESCAPEHYPHENS)

%.7: $(srcdir)/%.7_main
	@echo "    [MAN] $@"
	$(Q) $(SUBSTVARS)
	$(Q) $(ESCAPEHYPHENS)

%.8: $(srcdir)/%.8_main
	@echo "    [MAN] $@"
	$(Q) $(SUBSTVARS)
	$(Q) $(ESCAPEHYPHENS)

%.8: %.8_gen
	@echo "    [MAN] $@"
	$(Q) $(SUBSTVARS)
	$(Q) $(ESCAPEHYPHENS)

$(MAN8SO): lvmconfig.8
	@echo "    [MAN] $@"
	$(Q) echo ".so $<" > $@

install_man5: $(MAN5)
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL) -d $(MAN5DIR)
	$(Q) $(INSTALL_DATA) $(MAN5) $(MAN5DIR)/

install_man7: $(MAN7)
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL) -d $(MAN7DIR)
	$(Q) $(INSTALL_DATA) $(MAN7) $(MAN7DIR)/

install_man8: $(MAN8) $(MAN8SO)
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL) -d $(MAN8DIR)
	$(Q) $(INSTALL_DATA) $(MAN8) $(MAN8SO) $(MAN8DIR)/

install_lvm2: install_man5 install_man7 install_man8

install_cluster: $(MAN8CLUSTER)
ifdef MAN8CLUSTER
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL) -d $(MAN8DIR)
	$(Q) $(INSTALL_DATA) $(MAN8CLUSTER) $(MAN8DIR)/
endif

install_device-mapper: $(MAN8DM)
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL) -d $(MAN8DIR)
	$(Q) $(INSTALL_DATA) $(MAN8DM) $(MAN8DIR)/

install_systemd_generators: $(MAN8SYSTEMD_GENERATORS)
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL) -d $(MAN8DIR)
	$(Q) $(INSTALL_DATA) $(MAN8SYSTEMD_GENERATORS) $(MAN8DIR)/

install: install_lvm2 install_device-mapper install_cluster

install_all_man: install install_systemd_generators

# Copy generated man pages back to source tree as fallback for machines where generator doesn't work
pregenerated_man: all
	set -e ; for i in $(srcdir)/*.8_des; do \
		CMD=`basename $$i .8_des`; \
		cat $${CMD}.8_gen > $(srcdir)/$$CMD.8_pregen ; \
	done

generate: pregenerated_man
