# ---------------------------------------------------------------------------
# Allegro DIALOG Editor
# global makefile, getting scarier with each release...
# ---------------------------------------------------------------------------

COMMA   := ,
NOTHING :=
SPACE   := $(NOTHING) $(NOTHING)

.PHONY: default clean veryclean plugins_h plugins_lst info directories

include $(MAKEFILE_INC)

ifeq ($(plug)$(unplug),)
default: directories dlg$(EXE)
else
default: directories plugins_lst plugins_h dlg$(EXE)
	@echo --
	@echo Plugins enabled: $(PLUGINS)
endif



# --- Rules for plugging/unplugging -----------------------------------------

PLUGINS_LST := $(subst /,$(DIRECTORY_SEPARATOR),$(OBJ_DIR)/plugins.lst)

ifeq ($(wildcard $(PLUGINS_LST)),)
ifeq ($(plug),)
plug = allegro dlg_gui tetris
endif
endif

-include $(OBJ_DIR)/plugins.lst

ALL_PLUGINS := $(sort $(basename $(notdir $(wildcard plugins/*.c) $(wildcard plugins/*.mak))))
PLUG        := $(subst $(COMMA),$(SPACE),$(plug))
UNPLUG      := $(subst $(COMMA),$(SPACE),$(unplug))
UNKNOWN     := $(filter-out $(ALL_PLUGINS), $(PLUG) $(UNPLUG))
PLUGINS     := $(sort $(filter-out $(UNPLUG),$(PLUGINS)) $(PLUG))
PLUGINS     := $(filter $(ALL_PLUGINS),$(PLUGINS))

plugins_lst:
ifneq ($(UNKNOWN),)
	@echo !! Unknown plugins: $(UNKNOWN)
endif
	@echo PLUGINS = $(PLUGINS) > $(PLUGINS_LST)

$(OBJ_DIR)/plugins.lst: directories
	@echo PLUGINS = $(PLUGINS) > $(PLUGINS_LST)

info:
	@echo Plugins available:  $(ALL_PLUGINS)
	@echo Plugins enabled:    $(PLUGINS)



# --- Rules for building the plugins ----------------------------------------

PLUGINS_H        := $(subst /,$(DIRECTORY_SEPARATOR),src/plugins.h)
PLUGIN_MAKEFILES := $(wildcard $(addprefix plugins/,$(addsuffix .mak,$(PLUGINS))))
PLUGIN_SOURCES   :=
PLUGIN_DEPS      :=
PLUGIN_OBJS      :=
PLUGIN_LIBS      :=

ifneq ($(PLUGIN_MAKEFILES),)
include $(PLUGIN_MAKEFILES)
endif

PLUGIN_SOURCES   += $(wildcard $(addprefix plugins/,$(addsuffix .c,$(PLUGINS))))
PLUGIN_SRC_DIRS  := $(sort $(dir $(PLUGIN_SOURCES)))
PLUGIN_OBJ_DIRS  := $(addprefix $(OBJ_DIR)/,$(PLUGIN_SRC_DIRS))
PLUGIN_OBJS      += $(addsuffix $(OBJ),$(basename $(PLUGIN_SOURCES)))

ifneq ($(PLUGIN_MAKEFILES),)
PLUGIN_DEPS += $(PLUGIN_MAKEFILES)
endif

define GENERATE_PLUGINS_H
@echo Generating src/plugins.h ...
@echo { > $(PLUGINS_H)
$(foreach i,$(PLUGINS),@echo extern void install_$(i)_plugin F_DECL >> $(PLUGINS_H)
)
$(foreach i,$(PLUGINS),@echo install_$(i)_plugin F_CALL >> $(PLUGINS_H)
)
@echo } >> $(PLUGINS_H)
endef

src/plugins.h: $(PLUGIN_INCLUDES) $(PLUGIN_MAKEFILES)
	$(GENERATE_PLUGINS_H)

plugins_h:
	$(GENERATE_PLUGINS_H)



# --- Compiling -------------------------------------------------------------

OBJ_FILES := dedit$(OBJ) dlg$(OBJ) guiprocs$(OBJ) strparse$(OBJ) \
             pluginit$(OBJ) fileops$(OBJ) $(PLUGIN_OBJS)
OBJ_FILES := $(addprefix $(OBJ_DIR)/,$(OBJ_FILES))

vpath %.c     src/ $(sort $(dir $(PLUGIN_SOURCES)))
vpath %.h     src/ $(sort $(dir $(PLUGIN_SOURCES)))

$(OBJ_DIR)/dlg$(OBJ):      dlg.c dedit.h
$(OBJ_DIR)/dedit$(OBJ):    dedit.c dedit.h guiprocs.h strparse.h fileops.h
$(OBJ_DIR)/guiprocs$(OBJ): guiprocs.c guiprocs.h
$(OBJ_DIR)/strparse$(OBJ): strparse.c strparse.h
$(OBJ_DIR)/fileops$(OBJ):  fileops.c fileops.h strparse.h
$(OBJ_DIR)/pluginit$(OBJ): pluginit.c dedit.h plugins.h

$(OBJ_DIR)/%$(OBJ): %.c
	$(BUILD)

dlg$(EXE): $(OBJ_FILES) $(PLUGIN_DEPS)
	$(LINK)

define CHECK_DIRECTORY
$(if $(wildcard $(1)), 
	$(NOTHING),               
	$(MKDIR) $(subst /,$(DIRECTORY_SEPARATOR),$(1:%/=%))
)
endef

directories:
	$(call CHECK_DIRECTORY,obj)
	$(call CHECK_DIRECTORY,$(OBJ_DIR))
	$(foreach i,$(PLUGIN_OBJ_DIRS),$(call CHECK_DIRECTORY,$(i)))



# --- Utility targets -------------------------------------------------------

clean:
	-$(RMDIR) $(subst /,$(DIRECTORY_SEPARATOR),$(OBJ_DIR)/plugins)
	-$(RM)    $(subst /,$(DIRECTORY_SEPARATOR),$(OBJ_DIR)/*$(OBJ))
	-$(RM)    $(subst /,$(DIRECTORY_SEPARATOR),src/plugins.h)

veryclean: clean
	-$(RMDIR) obj
	-$(RM)    dlg$(EXE)
	-$(RM)    makefile
