#----------------------------------------------------------
#----------------------------------------------------------
export PROJWD := $(shell pwd)

export PRXXDIR   := $(shell dirname "$(PROJWD)")
export PROJNAME  := $(shell basename "$(PROJWD)")
export BINDIR    := $(PRXXDIR)/local/m68k-uclinux/bin
export INCDIR    := $(PRXXDIR)/local/m68k-uclinux/include
export SAGLIBDIR:=$(PRXXDIR)/local/saglib
export HOSTBINDIR:=$(PRXXDIR)/local/bin

ifneq ($(MAKECMDGOALS),distclean)
ifneq ($(MAKECMDGOALS),clean)
ifeq "$(wildcard $(BINDIR)/m68k-uclinux-gcc)" ""
    $(error cannot find cross software in $(BINDIR))
endif
endif
endif

#-----------------------------------
# include userspecific configs
#-----------------------------------
export CCACHE_LOGFILE=$(shell pwd)/ccache-log

export LANG=C

include labpro-cubis.config

#----------------------------------------------------------
# target specific settings
#----------------------------------------------------------

MAKEFLAGS += --no-builtin-rules
CROSS_COMPILE-m68k-elf   = $(BINDIR)/m68k-elf-
CROSS_COMPILE-i386-linux =
export CROSS_COMPILE=$(CROSS_COMPILE-$(TARGET))


MSWITCH-m68k-elf         = -m528x
MSWITCH-i386-linux       =
export MSWITCH=$(MSWITCH-$(TARGET))

ASFLAGS-m68k-elf += --register-prefix-optional
LDFLAGS-m68k-elf += -Wl,-elf2flt -Wl,--wrap,__assert

#LDFLAGS-m68k-elf += -nostdlib $(PRXXDIR)/local/m68k-uclinux/lib/crt0.o
#LDFLAGS-m68k-elf += -nodefaultlibs

#LDLIBS += -L$(PROJWD)/src/saglib -lcpplib #-L $(PRXXDIR)/local/m68k-uclinux/lib
#export CPPLIBS = -lstdc++xx

#-----------------------------------------------------
# deny all long double functions
# these should not be used, since mcf cannot handle this
#-----------------------------------------------------
XF = addxf3 negxf2 \
	nexf2 ltxf2 eqxf2 lexf2 gexf2 \
	extenddfxf2 fixxfsi truncxfdf2 mulxf3 floatsixf subxf3 cmpxf2 truncxfsf2 divxf3 \
	extendsfxf2 gtxf2
WRAP_XF=$(foreach func,$(XF),-Wl,--wrap,__$(func))

LDFLAGS-m68k-elf += $(WRAP_XF)


#-----------------------------------------------------
# this will replace cxa_demangle with our own version
# (which will save 20kbyte per binary)
#-----------------------------------------------------

WARNINGS = \
	-Wunknown-pragmas \
	-Wwrite-strings \
	-Wpointer-arith \
	-Wshadow \
	-Wundef \
	-Werror

#	-Wextra \
CXXWARNINGS = -Wnon-virtual-dtor
#-Weffc++

CFLAGS-m68k-elf   += -O3 -Os -Wall $(WARNINGS) $(CXXWARNINGS) -g $(DEFINES) $(INCLUDES) -fno-exceptions #-fshort-enums
CFLAGS-i386-linux =  $(PROFILE_FLAG_LINUX)    -Wall -Werror -g $(DEFINES) $(INCLUDES)

export ROMFSINST-i386-linux=echo
export ROMFSINST-m68k-elf=$(PROJWD)/bin/romfs-inst.sh -v
#----------------------------------------------------------
# define the cross tools
#----------------------------------------------------------

export CC	:=$(CCACHE) $(CROSS_COMPILE)gcc $(MSWITCH)
export CXX	:=$(CCACHE) $(CROSS_COMPILE)g++ $(MSWITCH)
export CPP	:=$(CCACHE) $(CROSS_COMPILE)cpp $(MSWITCH)
export LD	:=$(CROSS_COMPILE)ld #$(MSWITCH)
export AS	:=$(CROSS_COMPILE)as  $(MSWITCH)
export AR	:=$(CROSS_COMPILE)ar
export OBJDUMP	:=$(CROSS_COMPILE)objdump
export OBJCOPY	:=$(CROSS_COMPILE)objcopy
export RANLIB	:=$(CROSS_COMPILE)ranlib
export FLTHDR	:=$(CROSS_COMPILE)flthdr
export ROMFSINST:=$(ROMFSINST-$(TARGET))
export GENROMFS :=$(BINDIR)/genromfs
export HOSTCC	:=$(CCACHE) gcc
export HOSTCXX	:=$(CCACHE) g++
export XGETTEXT :=xgettext

export CFLAGS   += $(CFLAGS-$(TARGET))
export ASFLAGS  += $(ASFLAGS-$(TARGET))
export LDFLAGS	+= $(LDFLAGS-$(TARGET))
export LDLIBS	+= $(LDLIBS-$(TARGET))
export SUBDIRS  += $(SUBDIRS-$(TARGET))


export CXXFLAGS += $(CFLAGS)

ifeq ($(wildcard $(HOSTBINDIR)/xgettext),$(HOSTBINDIR)/xgettext)
	export XGETTEXT :=$(HOSTBINDIR)/xgettext
endif
#----------------------------------------------------------
# define the subdirs to make
#----------------------------------------------------------

export SUBDIRS=$(SUBDIRS-$(TARGET))

ifeq ($(TARGET), m68k-elf)
	ALL = $(IMAGES)
else
	ALL = $(SUBDIRS)
endif

ifneq ($(BUILDTARGET)x,x)
	BUILDALL = $(BUILDTARGET)
else
	BUILDALL = $(ALL)
endif

all : $(BUILDALL)

distclean :
	find . -type f -name "*~"  -print0 | xargs -0 -r rm -v
	find . -type f -name ".#*" -print0 | xargs -0 -r rm -v

dist : clean
	echo PROJNAME=$(PROJNAME)
	cd .. && tar -czvf $(PROJNAME)-`date +%Y-%m-%d-%H%M%S`.tar.gz $(PROJNAME)

.PHONY : romfs

$(warning BUSYBOX-$(HW)=$(BUSYBOX-$(HW)))
$(warning BUSYBOX-labpro=$(BUSYBOX-labpro))


CONFIG_busybox=$(foreach config,$(BUSYBOX-$(HW)),CONFIG_USER_BUSYBOX_$(config)=y)
#$(error CONFIG_busybox=$(CONFIG_busybox))

export ROMFSDIR=$(PROJWD)/romfs
export   PREFIX=$(PROJWD)/romfs

$(SUBDIRS): FORCE
	@echo "Make $@"
	@$(CONFIG_$@) $(MAKE) -C src/$@ $(MAKEDEFS) all install

busybox-install:
	@rm -f $(BUSYBOX)/install
	MAKEFLAGS="" \
	CFLAGS="$(filter-out -Wundef,$(CFLAGS)) \
	-DCONFIG_HW='\"Labpro-Cubis\"'" \
	$(CONFIG_busybox) \
	$(MAKE) -C $(BUSYBOX) $(MAKEDEFS) all install
	test -z "$(COPYDEST)" || cp $(BUSYBOX)/busybox.gdb $(COPYDEST)/gdb/busybox
	test -z "$(COPYDEST)" || cp $(BUSYBOX)/busybox.gdb $(COPYDEST)/gdb/sh


VERSION:=$(shell perl -ne 'm:VERSION_STR\s+"(.*)": && print $$1' src/version/version.h)
MINBIOS:=$(shell perl -ne 'm:MIN_BIOS_VERS\s+"(.*)": && print $$1' src/version/version.h)
DATE:=$(shell date +%Y-%m-%d-%H:%M:%S)

#----------------------------------------------------------
# pruefen, dass keine absoluten pfade in asserts stehen
#----------------------------------------------------------
check-strings:
	if egrep '\.string.*"/.*\.(cpp|h)"' $$(find . -name "*.lst") ; then echo "absolute pfade im assert"; exit 1 ; fi

$(BRANCH).bin : $(SUBDIRS) check-strings busybox-install
	cp -vau $(KERNEL-$(BRANCH)) $(ROMFSDIR)/vmlinux
	if [ "$$(find $(ROMFSDIR) -name '.svn')" != "" ] ; then echo "SVN in ROMFS" ; exit 1 ; fi
	if [ "$$(find $(ROMFSDIR) -name '*~')" != "" ] ; then echo "~ in ROMFS" ; exit 1 ; fi
	mkdir -p images
	echo -e "firm_vers=$(VERSION).$(FIRM_BUILD)\nmin_bios_vers=$(MINBIOS)\nlinux_build=$(LINUX_BUILD)\nuclibc_build=$(UCLIBC_BUILD)" >$(ROMFSDIR)/vers.txt
	$(GENROMFS) -x CVS -V "$(BRANCH)-Firm $(VERSION).$(FIRM_BUILD) $(DATE)" -d $(ROMFSDIR) -f images/$(BRANCH)-firm.romfs
	#------------------------------------
	# produce image for bios-tftp-get
	#------------------------------------
	( cat images/$(BRANCH)-firm.romfs ; openssl dgst -md5 -binary images/$(BRANCH)-firm.romfs ) >images/$@
	cp images/$@ /tftpboot/$(BRANCH)-firm.bin
	cp images/$@ /tftpboot/$(BRANCH)-firm-$(VERSION).bin
	(cd /tftpboot && ls $(BRANCH)-*.bin) >/tftpboot/$(BRANCH).filelist
	chmod a+r /tftpboot/$(BRANCH)-* /tftpboot/$(BRANCH).*
	#------------------------------------
	# produce compressed image for FlashIt (preceed length of uncompressed image)
	#------------------------------------
	( perl -e 'print pack("N",-s "images/$@");';cat images/$@ ) | \
	gzip -c -v - >images/Labpro\ Cubis\ Gpl-Firm\ $(VERSION).biz
	echo $@ done

#------------------------------------------------------------
# clean cleans every subdir in src with a Makefile,
# independent of SUBDIRS
#------------------------------------------------------------
CLEANDIRS=$(addprefix clean-,$(dir $(wildcard src/*/Makefile)))

clean: $(CLEANDIRS)
	rm -rf *.bin *.biz *.cksum *-api *.md5 images romfs $(BRANCH)-romfs $(BUSYBOX)/install $(SAGLIBDIR)

$(CLEANDIRS) : FORCE
	$(MAKE) -C $(subst clean-,,$@) $(MAKEDEFS) clean

documentation:
	doxygen Doxyfile

test: $(TESTDIRS)

$(TESTDIRS): FORCE
	@echo "Testing $@"
	$(MAKE) -C $@ test

#------------------------------------------------------------
# this target is used to force building
#------------------------------------------------------------

beta-files:
	smbclient

FORCE:
