include cmds/makefiles/Makefile.common

# A bundle is a collection of LaTeX packages, classes, default config files and source PDF-Files.
# A bundle may consist of only one such file.
# Every bundle is in one subdir, which contains a source and a test as sub(sub)directories.
# Currently BUNDLES are no targets.
BUNDLES := \
    bardd-common \
    bardd-document \
    bardd-letter \
    delegation-database \
    fsret-common \
    fsret-delegation \
    fsret-invoice \
    fsret-letter \
    fsret-letter-simple \
    fsret-rental \
    fsret-session \
    fsv-britzel \
    pcfhelp \
    rulerpaper \
    linlog-paper \
    logos \
    framed-mc \
    tabu-myfix \
    tud-document

BUNDLE_MAKEFILE_TEMPLATE      := cmds/makefiles/Makefile.bundle
BUNDLE_TEST_MAKEFILE_TEMPLATE := cmds/makefiles/Makefile.test

# ===== define commands

# $(COPY) SOURCE_FILE TARGET_FILE
COPY := cp

# ===== define proper variable values

# TODO switch from BUNDLE_test to BUNDLE/Makefile_test

BUNDLE_MAKEFILES       := $(BUNDLES:%=%/Makefile)
BUNDLE_PACK_TARGETS    := $(BUNDLES:%=%_pack)
BUNDLE_INSTALL_TARGETS := $(BUNDLES:%=%_install)

BUNDLE_TEST_MAKEFILES         := $(BUNDLES:%=%/test/Makefile)
BUNDLE_TEST_TARGETS           := $(BUNDLES:%=%_test)
BUNDLE_TEST_CLEAN_TARGETS     := $(BUNDLES:%=%_test_clean)
BUNDLE_TEST_DISTCLEAN_TARGETS := $(BUNDLES:%=%_test_distclean)

# ===== targets
.PHONY: \
    help info \
    all_makefiles all_pack all_install \
    all_test_makefiles all_test all_test_clean all_test_distclean \
    \
    $(BUNDLE_MAKEFILES) \
    $(BUNDLE_PACK_TARGETS) \
    $(BUNDLE_INSTALL_TARGETS) \
    \
    $(BUNDLE_TEST_MAKEFILES) \
    $(BUNDLE_TEST_TARGETS) \
    $(BUNDLE_TEST_CLEAN_TARGETS) \
    $(BUNDLE_TEST_DISTCLEAN_TARGETS)


define help_text
TARGETS:

help (default target)
    print this help message
info
    print values of variables
all_makefiles
    copy cmds/makefiles/Makefile.bundle to all BUNDLES
all_pack
    executes the pack target of each BUNDLE/Makefile
all_install
    executes the install target of each BUNDLE/Makefile
all_test_makefiles
    copy cmds/makefiles/Makefile.test to all BUNDLES as BUNDLE/test/Makefile
all_test:
    executes the all target of each BUNDLE/test/Makefile
all_test_clean
    executes the clean target of each BUNDLE/test/Makefile
all_test_distclean
    executes the distclean target of each BUNDLE/test/Makefile

(BUNDLE/test/Makefile)
    ensures that each BUNDLE/test/Makefile is equal to $(BUNDLE_TEST_MAKEFILE_TEMPLATE) is
(BUNDLE_test_all)
	executes the all target of the  BUNDLE/test/Makefile
(BUNDLE_test_clean)
    executes the clean target of the  BUNDLE/test/Makefile
(BUNDLE_test_distclean)
    executes the distclean target of the  BUNDLE/test/Makefile

endef

define info_text
BUNDLE_MAKEFILE_TEMPLATE      := $(call info_var_value, BUNDLE_MAKEFILE_TEMPLATE     )
BUNDLE_TEST_MAKEFILE_TEMPLATE := $(call info_var_value, BUNDLE_TEST_MAKEFILE_TEMPLATE)
BUNDLES                       := $(call info_var_value, BUNDLES                      )
BUNDLE_MAKEFILES              := $(call info_var_value, BUNDLE_MAKEFILES             )
BUNDLE_PACK_TARGETS           := $(call info_var_value, BUNDLE_PACK_TARGETS          )
BUNDLE_INSTALL_TARGETS        := $(call info_var_value, BUNDLE_INSTALL_TARGETS       )
BUNDLE_TEST_MAKEFILES         := $(call info_var_value, BUNDLE_TEST_MAKEFILES        )
BUNDLE_TEST_TARGETS           := $(call info_var_value, BUNDLE_TEST_TARGETS          )
BUNDLE_TEST_CLEAN_TARGETS     := $(call info_var_value, BUNDLE_TEST_CLEAN_TARGETS    )
BUNDLE_TEST_DISTCLEAN_TARGETS := $(call info_var_value, BUNDLE_TEST_DISTCLEAN_TARGETS)

endef

help:
	$(info $(help_text))

info:
	$(info $(info_text))

$(BUNDLE_MAKEFILES): $(BUNDLE_MAKEFILE_TEMPLATE)
	@$(COPY) $< $@

all_makefiles: $(BUNDLE_MAKEFILES)

$(BUNDLE_PACK_TARGETS): %_pack: %/Makefile
	$(MAKE) -C $* pack

all_pack: $(BUNDLE_PACK_TARGETS)

$(BUNDLE_INSTALL_TARGETS): %_install: %/Makefile
	$(MAKE) -C $* install

all_install: $(BUNDLE_INSTALL_TARGETS)

$(BUNDLE_TEST_MAKEFILES): $(BUNDLE_TEST_MAKEFILE_TEMPLATE)
	@$(COPY) $< $@

all_test_makefiles: $(BUNDLE_TEST_MAKEFILES)

$(BUNDLE_TEST_TARGETS): %_test: %/test/Makefile
	$(MAKE) -C $*/test all

all_test: $(BUNDLE_TEST_TARGETS)

$(BUNDLE_TEST_CLEAN_TARGETS): %_test_clean: %/test/Makefile
	$(MAKE) -C $*/test clean

all_test_clean: $(BUNDLE_TEST_CLEAN_TARGETS)

$(BUNDLE_TEST_DISTCLEAN_TARGETS): %_test_distclean: %/test/Makefile
	$(MAKE) -C $*/test distclean

all_test_distclean: $(BUNDLE_TEST_DISTCLEAN_TARGETS)
