#
#ident "$Revision: 1.1.1.1 $"
#
# Common makefile rules.
#
# Notes:
#	- After including $(ROOT)/usr/include/make/commondefs, a makefile may
#	  say ``include $(COMMONRULES)'' to get this file.
#	- It is up to the including makefile to define a default rule before
#	  including $(COMMONRULES).
#	- The parent makefile must define TARGETS in order for clobber to work.
#	- If the parent makefile must overload the common targets with special
#	  rules (e.g. to perform recursive or subdirectory makes), then set
#	  COMMONPREF to some unique prefix before including $(COMMONRULES),
#	  and make sure that each common target depends on its prefixed name.
#	  For example, a makefile which passes common targets and install on
#	  to makes in subdirectories listed in DIRS might say
#
#		COMMONPREF=xxx
#		include $(COMMONRULES)
#
#		$(COMMONTARGS) install: $(COMMONPREF)$$@
#			@for d in $(DIRS); do \
#				$(ECHO) "\tcd $$d; $(MAKE) $@"; \
#				cd $$d; $(MAKE) $@; cd ..; \
#			done
#
#	  Thus, all of the common rules plus install are passed to sub-makes
#	  *and* executed in the current makefile (as xxxclean, xxxclobber,
#	  xxxinstall, etc).  SUBDIRS_MAKERULE in commondefs is a convenience
#	  macro that expands to the above loop.
#

#
# Define basic rules and with recursion
#
default:

.PHONY: $(SUBDIRS) default headers exports install all clean clobber runtests

$(SUBDIRS):
	$(MAKE) -C $@ $(MAKECMDGOALS)

default headers exports install all clean clobber runtests: $(SUBDIRS)

#
# An always-unsatisfied target.  The name is unlikely to occur in a file tree,
# but if _force existed in a make's current directory, this target would be
# always-satisfied and targets that depended on it would not be made.
#
$(_FORCE):

#
# File removal rules: there are three.
#	- clean removes dirt
#	- clobber removes targets, dirt, and Makedepend
#	- rmtargets removes targets only
# One might 'make clean' in a large tree to reclaim disk space after targets
# are built, but before they are archived into distribution images on disk.
# One might 'make rmtargets' to remove badly-linked executables, and then
# run a 'make' to re-link the good objects.
#
$(COMMONPREF)clobber: $(COMMONPREF)clean $(COMMONPREF)rmtargets $(_FORCE)
	rm -f .*.d

$(COMMONPREF)clean: $(_FORCE)
	rm -rf $(DIRT)

$(COMMONPREF)rmtargets: $(_FORCE)
	rm -rf $(TARGETS)

#
# Lint and C tags support.
#
$(COMMONPREF)fluff: $(_FORCE)
	$(LINT) $(LINTFLAGS) $(CDEFS) $(CINCS) $(CFILES) $(LDLIBS)

CTAGS=etags

$(COMMONPREF)tags: $(_FORCE)
	rm -f tags
	find . \( -name '*.[cfhlpy]' -o -name '*.cpp' -o -name '*.c++' \) \
		! -name '.*' ! -name 'llib-*' ! -name '*,v' \
		$(CTAGFINDARGS) -print | \
	    sed 's:^\./::' | \
	    xargs $(CTAGS) -a $(CTAGOPTS)
	if test -f tags; then \
		sort -u +0 -1 -o tags tags; \
	fi

#
# Rules to build dependency files
#
.%.d : %.s
	$(AS) $(ASFLAGS) $(CPPFLAGS) -M $< > $@

.%.d : %.c
	$(CC) -c $(CFLAGS) $(CPPFLAGS) -M $< > $@

.%.d : %.cpp
	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -M $< > $@

#
# Build elf files from .o
#
%.elf: %.o
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)

#
# Convert elf files to binary
#
%.bin: %.elf
	$(CONVERT) -o $@ -s $<

#
# Convert bin files to bss padded bin files
#
%.pad: %.bin
	dd if=$^ of=$@ bs=`nm -n $*.elf | grep __bss_end | python -c "import sys;s = sys.stdin.read();print (int(s.split()[0],16)+15)&~15"` count=1 conv=sync

#
# Add a rule to start the hw simulator
#
start_simulator:
	@if [ "$SIM_TOOL" != "cver" ]; then \
        for (( x=0; x < 30; x++ )); do \
            if [ `wget -O- http://coyote/cgi-bin/gotlicense 2> /dev/null` -eq "1" ]; then \
                break; \
            else \
                echo "All licenses are in use. Sleeping...[$$x]" ;sleep 3; \
            fi; \
        done; \
    fi
	SIMDEFS="+define+FASTFLASH" make -C $(shell echo $(shell pwd) | sed -e 's|\(.*\)/sw/.*|\1/hw/chip/sim|') ipc &
	sleep 5

#
# A better version of smake's makelib.mk rule.
# XXX fix makelib.mk in next release and remove this rule.
#
MAKELIB: .USE .PRECIOUS
	$(AR) c$(ARFLAGS) $@ $?
	rm -f $?

#
# Rule to check that required variables are set
#
_check_vars:	$(_FORCE)
	@if test "" = "$(ROOT)"; then \
		echo ROOT not set; \
		exit 1; \
	fi
	@if test "" = "$(SYSPREF)"; then \
		echo SYSPREF not set; \
		exit 1; \
	fi

#
# Include the make dependency files if they exist or can be built.
#

ifeq ($(filter headers clean clobber, $(MAKECMDGOALS)),)
    ifneq ($(DEPFILES),)
        .SILENT: $(DEPFILES)
        sinclude $(DEPFILES)
    endif
endif

ifneq ($(filter -mthumb-interwork, $(COPTS)),)
ifeq ($(filter -marm, $(COPTS)),)
GCOPTS	+= -mthumb
endif
ifeq ($(filter -marm, $(C++OPTS)),)
GC++OPTS	+= -mthumb
endif
endif

#
# Local make rules
#
sinclude $(LOCALRULES)
