top_srcdir=.
include config.mk

ECHO=/bin/echo
ifeq ($(shell uname),FreeBSD)
MAKE=gmake
else
MAKE=make
endif

SUBDIRS=  tools
SUBMODULES=ppc boards devices printer c16x avr8 mips64 sh4 coldfire \
	   mos6510 m16c cli mcs51 float
SHLIBS=

.PHONY: $(SUBDIRS) $(SUBMODULES)  subdirs depend all default


INCLUDES:=$(patsubst %,-I%,$(SUBDIRS)) -I.
INCLUDES += $(patsubst %,-I%,$(SUBMODULES)) -I.

SRCFILES:=softgun.c arm9cpu.c idecode.c mmu.c instructions.c ns9750_mem.c ns9750_serial.c \
	ns9750_timer.c ns9750_bbus.c ns9750_pci.c ns9750_usb.c ns9750_eth.c ns9750_bbdma.c \
	pl190_irq.c ns9xxx_i2c.c arm_vfp.c xy_tree.c xy_hash.c bus.c signode.c \
	ste10_100.c m93c46.c linux-tap.c fio.c socket_can.c \
	sja1000.c dram.c sram.c amdflash.c lacc_can.c usb_ohci.c cycletimer.c \
	configfile.c lxt971a.c ml6652.c \
	loader.c i2c_serdes.c m24cxx.c pcf8563.c i82559.c\
	pcf8575.c pcf8574.c pc16550.c pca9544.c max6651.c lm75.c pcf8591.c \
	ads7828.c ihex.c srec.c shlib.c mainloop_events.c gdebug.c  diskimage.c \
	lpcflash.c lpc2106_timer.c  lpc2106_gpio.c lpc2106_scb.c \
	imx21_uart.c aitc.c imx_timer.c imx21_lcdc.c imx21_crm.c serial.c cs8900.c \
	imx21_gpio.c isp1301.c imx21_otg.c imx21_sdhc.c imx21_dmac.c mmcard.c \
	clock.c imx21_eim.c imx21_wdog.c imx21_sdrc.c imx21_rtc.c rfbserver.c \
	imx21_cspi.c ds1305.c sht71.c imx21_pwm.c keyboard.c matrix_keyboard.c \
	imx21_i2c.c at91_usart.c at91_tc.c at91_aic.c usbdevice.c usbstdrq.c\
	djet460.c relais.c at91_emac.c at91_twi.c ds3234.c at91_mc.c at91_st.c \
	at91_pmc.c at91_pio.c ds1337.c at91_ebi.c senseless.c imx21_max.c \
	imx21_pcmcia.c at91_mci.c at91_pdc.c lh79520_uart.c thumb_decode.c \
	thumb_instructions.c hello_world.c lh79520_ssp.c logical.c sgstring.c \
	s3c2410_intco.c s3c2410_nand.c nand.c s3c2410_memco.c s3c2410_uart.c \
	parport_pc.c lh79520_rcpc.c mmc_crc.c crc32.c pca9548.c tx49xx_sio.c \
	isp1105.c  filesystem.c lpc2106_i2c.c at91sam_efc.c nullsound.c \
	alsasound.c sound.c sd_spi.c fbdisplay.c strhash.c \
	debugvars.c debugger.c sglib.c


# SHSRC := 
TARGETS := .depend version.c subdirs softgun
INSTALL_BINS := softgun
default: all

ifneq ($(MAKECMDGOALS),clean)
-include .depend
endif

include $(patsubst %,%/module.mk,$(SUBMODULES))

OBJS := $(SRCFILES:.c=.o) version.o 
OBJS_BE :=$(SRCFILES:.c=.be.o) version.be.o 

#
# Generate shared libraries from a LIST of SHLIBS 
# each defining a variable called SHOBJS_$(library)
#

# First remove the path and the suffix
SHLIBNAMES=$(basename $(notdir $(SHLIBS)))
# Gererate a list of the variables containing the Objects
SHSRC_LISTS=$(foreach c,$(SHLIBNAMES),SHSRCS_$c)
# Generate a list of the Objects
SHSRCS = $(foreach c,$(SHSRC_LISTS),$($(c)))

SHOBJS += $(SHSRCS:.c=.po)

#
# Make an object list for each shared lib using static pattern Rules
#
.SECONDEXPANSION:
$(SHLIBS): %.so:  $$(addsuffix .po,$$(basename $$($$(foreach x,$$(basename $$(notdir %)),SHSRCS_$$x))))
	$(CC) $(SHAREDCFLAGS) $(DEFS) $(SHAREDLDFLAGS) $(CFLAGS) $^ -o $@

ALL_SRCS := $(SRCFILES) $(SHSRCS)

all: $(TARGETS) $(SHOBJS) $(SHLIBS)
	@#echo "Targets: " $(TARGETS)

subdirs: $(SUBDIRS)

$(SUBDIRS):
	@if [ -d $@ ]; then $(MAKE) -C $@; fi

version.c:
	$(shell $(ECHO) "/*" >> $@;) \
	$(shell $(ECHO) " * This file is automatically generated" >> $@;) \
	$(shell $(ECHO) " */" >> $@;) \
	$(shell $(ECHO) "" >> $@;) \
	$(shell $(ECHO) "#include <version.h>" >> $@;) \
	$(shell $(ECHO) -n "const char *softgun_version = \"" >> $@;) \
	$(shell x=$(CURDIR); $(ECHO) -n $${x##*/} >> $@;) \
	$(shell $(ECHO) "\";" >> $@;) 

install: $(INSTALL_BINS)
	@for f in $(INSTALL_BINS); do \
		install -m 755 $$f $(bindir); \
	done
	mkdir -p $(libdir)
	@for dir in $(SUBDIRS) ; do \
		if [ -d $$dir ]; then \
			$(MAKE) -C $$dir install; \
		fi; \
	done
	@for obj in $(SHLIBS) ; do \
		install -m 0755 $$obj $(libdir); \
	done


softgun: $(OBJS) 
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

softgun_be: $(OBJS_BE) 
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

boards/libboards.a:
	$(MAKE) -C boards libboards.a

depend: .depend

#####################################################
# make depend does not work for shared libraries 
# currently  (needs an .so dependecy not an .o)
#####################################################
.depend:
	rm -f .depend
	for file in $(ALL_SRCS); do \
		var=$$(dirname $$file); \
		echo -n "$$var/" >> .tmpdepend; \
		gcc -MM  $(INCLUDES)  $$file >> .tmpdepend; \
		cat .tmpdepend >> .depend; \
	done; \
	rm -f .tmpdepend

clean:
	rm -f $(TARGETS)  $(OBJS)
	for dir in $(SUBDIRS); do \
		if [ -d $$dir ]; then \
			$(MAKE) -C $$dir clean; \
		fi; \
	done; \
	rm -f $(SHOBJS) $(SHLIBS) .depend .tmpdepend
