#
# Copyright (c) 2003-2005 Atmark Techno, Inc.  All Rights Reserved.
#

#
# Guarantee that the top-level TARGET variable, if set, is armadilloj.
#
ifeq (, $(TARGET))
	TARGET := armadilloj
endif
ifeq (, $(PROFILE))
	.PROFILE := ctype
else
	.PROFILE := $(PROFILE)
endif

status :=
error :=

#
# Configure settings based on the target passed from the top-level
# makefile.  The PROFILE := armadilloj line is just a default and can
# be overridden from the command line.
#
NCVT = ../../../tools/ncvt
current-profile := $(shell $(NCVT) $(TARGET) $(.PROFILE))
ifneq (,$(wildcard profile-stamp))
	previous-profile := $(shell cat profile-stamp)
	ifneq ($(current-profile), $(previous-profile))
		error := profile-error
	endif
endif

#
# Configuration for Armadillo-J compiler, either stype or ctype
#
BUILD_NAME := $(shell $(NCVT) -c "-" loader $(TARGET) $(.PROFILE) v$(HERMIT_VERSION))
BUILD_TARGETS := $(BUILD_NAME).bin

CROSS_COMPILE ?= arm-elf-
GCC_VER := $(shell $(CROSS_COMPILE)gcc -dumpversion | sed "s/\..*//")
INCLUDEDIR := ../../../include
CC := $(CROSS_COMPILE)gcc
CFLAGS := -Wall -O2 -fomit-frame-pointer \
	  -DHERMIT_VERSION='"$(HERMIT_VERSION)"' \
	  -nostdlib -mcpu=arm7tdmi -static \
          -I$(INCLUDEDIR)
CFLAGS += -DTARGET_PROFILE=\"$(current-profile)\"
LDFLAGS := 

#
# The LDSCRIPT variable can be overridden based on the target-derived
# settings.
#
LDSCRIPT     := flash
OBJSECTIONS  := .boot .text .data .bss
OBJCOPYFLAGS := -O binary -S $(addprefix -j ,$(OBJSECTIONS))

ASMS         := boot.S lib1funcs.S head.S
SRCS         := entry.c loader.c memmap.c linux.c bootmode.c medium_io.c \
		memregions.c post.c
SRCS         += ../memzero.c ../medium.c ../frob.c ../gunzip.c
SRCS         += ../flash/flash_core.c ../flash/flash_amd.c

ifeq ($(GCC_VER), 2)
SRCS         += ../flash/flash_spi_dummy.c ../flash/flash_intel_dummy.c
endif

#
# Profile Specific
#
ifeq (ctype, $(.PROFILE))
	CFLAGS += -DARMADILLOJ_CTYPE
	status := profile-detect
endif

ifeq (stype, $(.PROFILE))
	CFLAGS += -DARMADILLOJ_STYPE
	status := profile-detect
endif

ifeq (stype-xk, $(.PROFILE))
	CFLAGS += -DARMADILLOJ_STYPE
	status := profile-detect
	BYTESWAP := y
endif

ifeq (ctype-jig, $(.PROFILE))
	SRCS += test.c
	CFLAGS += -DARMADILLOJ_CTYPE -DENABLE_JIG
	status := profile-detect
endif

ifeq (stype-jig, $(.PROFILE))
	SRCS += test.c
	CFLAGS += -DARMADILLOJ_STYPE -DENABLE_JIG
	status := profile-detect
endif

ifeq (, $(error))
ifeq (, $(status))
	error := profile-unknown
endif
endif

OBJS         := $(SRCS:.c=.o)
DEPS         := $(SRCS:.c=.d)
LIBS         := -ltarget -lc

all: $(error) profile-stamp $(BUILD_TARGETS)

profile-error:
	@echo "profile-stamp mismatch; 'make scrub' to switch profiles"
	@echo "  previous PROFILE:" $(previous-profile)
	@echo "   current PROFILE:" $(current-profile)
	@false
profile-unknown:
	@echo "unknown PROFILE: $(.PROFILE)"
	@false
profile-stamp:
	@echo "$(current-profile)" > $@

# Hermit second stage loader (ELF image)
$(BUILD_NAME).elf: $(ASMS) $(OBJS) ../common/libtarget.a $(BUILD_NAME).lds
	$(CC) $(CFLAGS) -L. -L../common \
		-Wl,-Map,$(BUILD_NAME).map \
		-Wl,-T$(BUILD_NAME).lds -o $@ \
		$(ASMS) $(OBJS) \
		-Wl,--start-group $(LIBS) -Wl,--end-group

$(BUILD_NAME).lds: loader.lds
	$(CPP) -P -x assembler-with-cpp $(CFLAGS) $< > $@

%.bin: %.elf
	$(CROSS_COMPILE)objcopy $(OBJCOPYFLAGS) $< $@.pre
	if [ "$(BYTESWAP)" = "y" ]; then                \
		dd if=$@.pre of=$@ conv=swab ;          \
	else						\
		cp $@.pre $@ ;                          \
	fi
	rm -f $@.pre

# automated dependency checking
ifeq (,$(filter clean scrub,$(MAKECMDGOALS)))
-include $(DEPS)

DEPENDS := ../../../depend.sh
%.d: %.c
	env CC=$(CC) $(DEPENDS) $< $@ $(CFLAGS)
endif

# installation
PHONY: install
install:
	$(INSTALL) -m 644 -o root -g root \
		$(BUILD_TARGETS) \
		$(INSTALLPREFIX)/lib/hermit/

# housecleaning
.PHONY: clean
clean:
	rm -f $(OBJS) loader-*.lds *.elf *.bin *.map
scrub: clean
	rm -f profile-stamp 
	rm -f *.d ../*.d ../flash/*.d
	rm -f *.o ../*.o ../flash/*.o
distclean: scrub
	rm -f *~





