#
# Copyright (c) 2007-2008 Atmark Techno, Inc.  All Rights Reserved.
#

#
# Guarantee that the top-level TARGET variable, if set, is Armadillo-5x0.
#
ifeq (,$(TARGET))
	TARGET := armadillo5x0
endif

.PROFILE := $(PROFILE)

status :=
error :=

#
# Configure settings based on the target passed from the top-level
# makefile.  The PROFILE := armadillo 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 standalone, optimized ARM926EJ-S cross-compile.
#
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
             > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)

BUILD_NAME := $(shell $(NCVT) -c "-" loader $(TARGET) $(.PROFILE) v$(HERMIT_VERSION))
BUILD_TARGETS := $(BUILD_NAME).bin

CROSS_COMPILE ?= arm-linux-
GCC_VER := $(shell $(CROSS_COMPILE)gcc -dumpversion | sed "s/\..*//")
INCLUDEDIR := ../../../include
CC := $(CROSS_COMPILE)gcc
MARCH := $(call cc-option, -march=armv6, -march=armv5t)
MTUNE := $(firstword \
		$(call cc-option, -mtune=arm1136jf-s) \
		$(call cc-option, -mtune=arm1136jfs) \
		$(call cc-option, -mtune=strongarm) \
		)
CFLAGS := -Wall -O2 -fomit-frame-pointer -I$(INCLUDEDIR) -nostdlib \
	-DHERMIT_VERSION='"$(HERMIT_VERSION)"' -static \
	$(MARCH) $(MTUNE)
CFLAGS += -DTARGET_STRING=\"$(TARGET)\" -DPROFILE_STRING=\"$(.PROFILE)\"
CFLAGS += -DCOMMAND_NEW_ASSIGN

#
# 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 :=
SRCS :=

ASMS += boot.S lib1funcs.S
SRCS += entry.c loader.c memregions.c memmap.c
SRCS += mmu.c medium_io.c board.c
SRCS += ../memzero.c ../medium.c ../frob.c ../gunzip.c
SRCS += ../flash/flash_core.c ../flash/flash_intel.c ../flash/param.c
SRCS += ../md5sum.c

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

#CFLAGS += -DEXPERIMENTAL
#CFLAGS += -DDEBUG_ETH
#CFLAGS += -DDEBUG_IDE
#CFLAGS += -DENABLE_DYNAMIC_REGION

ifeq (, $(.PROFILE))
	status := profile-detect
	CFLAGS += -DRELOCATE -DSTANDALONE -DARMADILLO500DEV
	CONFIG_CMD_BOOT_LINUX = y
	CONFIG_CMD_SET_BOOT_DEVICE = y
	CONFIG_CMD_SET_CLOCK = y
	CONFIG_CMD_SET_ENV = y
	CONFIG_CMD_TFTPDL = y
	CONFIG_HAVE_BASE_BOARD_ID = y
endif

ifeq (fx, $(.PROFILE))
	status := profile-detect
	CFLAGS += -DRELOCATE -DSTANDALONE -DARMADILLO500FX
	CONFIG_CMD_BOOT_LINUX = y
	CONFIG_CMD_SET_CLOCK = y
	CONFIG_CMD_SET_ENV = y
	CONFIG_CMD_TFTPDL = y
endif

ifeq (zero, $(.PROFILE))
	status := profile-detect
	CFLAGS += -DRELOCATE -DSTANDALONE -DZERO
endif

ifeq (boot, $(.PROFILE))
	status := profile-detect
	CFLAGS += -DBOOTMODE -DSTANDALONE -DZERO
	LDSCRIPT := bootmode
endif

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

ide-stack-source = pcmcia_core.c ide_core.c fs_ext2.c
network-stack-source = ../net/arp.c ../net/eth.c ../net/eth_util.c \
		       ../net/ip.c ../net/tftp.c ../net/udp.c ../net/mac.c
config-source-y :=
config-cflags-y :=
config-source-$(CONFIG_CMD_BOOT_LINUX) += linux.c
config-cflags-$(CONFIG_CMD_BOOT_LINUX) += -DHAVE_CMD_BOOT_LINUX
config-source-$(CONFIG_CMD_SET_BOOT_DEVICE) += cmd-set_boot_device.c
config-source-$(CONFIG_CMD_SET_BOOT_DEVICE) += $(ide-stack-source) ide_a5x0.c
config-cflags-$(CONFIG_CMD_SET_BOOT_DEVICE) += -DHAVE_IDE
config-source-$(CONFIG_CMD_SET_CLOCK) += cmd-set_clock.c
config-cflags-$(CONFIG_CMD_SET_ENV) += -DHAVE_CMD_SET_ENV
config-source-$(CONFIG_CMD_TFTPDL) += eth_smsc911x.c tftpdl.c
config-source-$(CONFIG_CMD_TFTPDL) += $(network-stack-source)
config-cflags-$(CONFIG_CMD_TFTPDL) += -DHAVE_ETHERNET
config-cflags-$(CONFIG_HAVE_BASE_BOARD_ID) += -DHAVE_BASE_BOARD_ID

SRCS += $(sort $(config-source-y))
CFLAGS += $(sort $(config-cflags-y))

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

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 Makefile $(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: $(wildcard loader.lds.*)
	$(CPP) -P -x assembler-with-cpp $(CFLAGS) loader.lds.$(LDSCRIPT) > $@

%.bin: %.elf
	$(CROSS_COMPILE)objcopy $(OBJCOPYFLAGS) $< $@

# 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 ../net/*.d
	rm -f *.o ../*.o ../flash/*.o ../net/*.o
