# CLAM System default rule and target definitions.

###############################################################################

#  This file contains composite macros and rules for creating objects.
#  This file should be included in the user makefile after the variables
#  have been initialized appropriately for the particular project being
#  created.  The user targets should be placed after the include
#  directive that specifies this file.

###############################################################################

# This ensures that any of other projects required by this one (defined through
# BUILD_BEFORE) get created before the real work in this project is done.
ifneq "$(BUILD_BEFORE)" ""
  FIRST_TARGETS += $(BUILD_BEFORE:%=%.make)
endif
ifneq "$(BUILD_AFTER)" ""
  LAST_TARGETS += $(BUILD_AFTER:%=%.make)
endif

# Make the default action be an error stop if we ca not find an appropriate rule.
.DEFAULT:
	$(HIDER)echo
	$(HIDER)echo [$@] is missing files or has a makefile problem.
	$(HIDER)echo
	$(HIDESH)$(CLAM_SCRIPTS)/exit_make.sh

# This rule halts make for some supposedly devastating reason.  More
# information should be printed out by the cause of the halt.
%.halt:
	@echo CLAM execution halted, the cause being: $@
	$(HIDESH)$(CLAM_SCRIPTS)/exit_make.sh

# Provides a time-stamp in the make log.
show_date.%:
	$(HIDER)echo "{$(shell date)}"

# The .make rule changes to the directory with the same first part of the
# pattern and makes whatever projects are there.  This is used by the build
# before procedure.
%.make:
	$(HIDESH) -c '\
if [ -d $* ]; then \
  if [ -f "$*/$(MAKEFILE_NAME)" ]; then \
    $(MAKE) --silent -f "$(MAKEFILE_NAME)" NOT_FIRST_MAKE=t -C "$*"; \
  else \
    echo "($@ skipping directory $*)"; \
  fi \
else \
  echo Skipping missing directory [$*]; \
fi'
#hmmm: maybe convert above to a script also.

# always run the exes listed in RUN_TARGETS.
.PHONY: run_targets

# "all" is the first target to execute in any makefile.  we capture it and
# use it to produce the requested actions.
all: start $(ACTUAL_FIRST_TARGETS) $(ACTUAL_TARGETS) $(ACTUAL_LAST_TARGETS) run_targets finish 

# "start" announces the beginning of compilation.
start:
	$(HIDESH) -c '\
if [ ! -d "$(CLAM_TMP)" ]; then \
  mkdir "$(CLAM_TMP)"; \
fi'
ifeq "$(QUIET)" ""
	$(HIDER)echo Project $(PROJECT) [$(shell echo $(CURRENT_DIR) | sed -e 's/.*\/\([^\/]*\)\/\([^\/]*\)/\1\/\2/')] v. $(major).$(minor).$(revision).$(build)
endif
	$(HIDER)rm -f $(FLAG_FILES)

# "finish" announces the end of compilation.  if there are targets to
# run, then they are executed here.
finish:
ifeq "$(QUIET)" ""
	$(HIDER)echo Finished $(PROJECT).
endif
	$(HIDER)rm -f $(FLAG_FILES) $(SUB_FLAG_FILES)
ifeq "$(NOT_FIRST_MAKE)" ""
	$(HIDESH) -c '\
if [ ! -f "$(FAILURE_FILE)" ]; then \
  $(SHELL) $(FEISTY_MEOW_SCRIPTS)/multimedia/sound_play.sh $(CLAM_FINISH_SOUND); \
fi'
endif
# toss the flag files so we do not see them again.
	$(HIDER)rm -f "$(DIRTY_FILE)" "$(SUBMAKE_FLAG)"

# runs the programs specified in the RUN_TARGETS variable.
run_targets:
	$(HIDESH)"$(CLAM_SCRIPTS)/target_runner.sh"

# "make_subdirs" travels down each subdirectory and builds using make.
make_subdirs:
	$(HIDESH)$(CLAM_SCRIPTS)/make_subdirs.sh

# "clean" is a default target that removes object files, libs, executable
# files and such that were created by the project.  it invokes the makefile
# again with the CLEAN variable defined so that this can be passed down into
# all subsequent makes.
clean: establish_cleanup_variable $(OTHER_CLEANS) scratch_other_cleans clean_subdirs add_to_cleanups_variable ready_to_clean
	@# no code here.

establish_cleanup_variable:
	$(eval CLEAN := true)

scratch_other_cleans:
	$(eval OTHER_CLEANS := )

# add late breaking items to the cleanup list.  this is mainly the actual
# targets to build, since those are not specified until the user makefile
# is included.  we take a liberty here and also add different versions of
# the file suffixes so we can clean all versions of the targets.
add_to_cleanups_variable: $(SUPPLEMENTAL_CLEANUP_TARGETS)
	$(eval CLEANUPS = $(ACTUAL_TARGETS) $(CLEANUPS) )
#	$(eval CLEANUPS = $(ACTUAL_TARGETS) $(ACTUAL_TARGETS:%.exe=%) $(ACTUAL_TARGETS:%.dll=%.so) $(ACTUAL_TARGETS:%.so=%.dll) $(CLEANUPS) )
#	echo "new CLEANUPS variable: $(CLEANUPS)"

# main cleaning task.
ready_to_clean:
ifneq "$(CLEANUPS)" ""
	@echo Whacking [$(notdir $(CLEANUPS))]
endif
	$(HIDESH) -c '\
if [ ! -z "$(CLEANUPS)" ]; then \
  for spork19 in $(CLEANUPS) nonexistentishfileforlist; do \
    rm -rf "$$spork19"; \
  done \
fi'

############################################################################

# "clean_subdirs" travels down each subdirectory and cleans using make.
clean_subdirs:
	$(HIDESH)$(CLAM_SCRIPTS)/clean_subdirs.sh

# "rm_links" removes the files in the current directory that are links
# to other files.  this is only useful in a unix environment.
rm_links:
	$(HIDESH) -c '\
for gujira26 in *; do \
  if [ -h "$$gujira26" ]; then \
    /bin/rm -f "$$gujira26"; \
  fi \
done; \
exit 0'

