## This is Architecture independant part of the makefile

uses CONFIG_HAVE_OPTION_TABLE
uses CONFIG_AP_CODE_IN_CAR
uses CONFIG_ASSEMBLER_DEBUG

makedefine CPP:= $(CC) -x assembler-with-cpp -DASSEMBLY -E
makedefine LIBGCC_FILE_NAME := $(shell $(CC) -print-libgcc-file-name)
makedefine GCC ?= $(CC)
makedefine GCC_INC_DIR := $(shell LC_ALL=C $(GCC) -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp")

makedefine CPPFLAGS := -I$(TOP)/src/include -I$(TOP)/src/arch/$(CONFIG_ARCH)/include -I$(GCC_INC_DIR) $(CPUFLAGS)
makedefine CFLAGS = $(CONFIG_CPU_OPT) $(DISTRO_CFLAGS) $(CPPFLAGS) -Os -nostdinc -nostdlib -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wno-trigraphs -Werror-implicit-function-declaration -Wstrict-aliasing -Wshadow -fno-common -ffreestanding -fno-builtin -fomit-frame-pointer

if CONFIG_ASSEMBLER_DEBUG
makedefine DEBUG_CFLAGS := -g -dA -fverbose-asm
end

makedefine HOSTCFLAGS:= -Os -Wall -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wno-trigraphs -Werror-implicit-function-declaration -Wstrict-aliasing -Wshadow

makerule ldscript.ld   
	depends	"ldoptions $(LDSUBSCRIPTS-1)" 
	action  "echo 'INCLUDE ldoptions' > $@; for file in $(LDSUBSCRIPTS-1) ; do echo /\* $$file \*/ >> $@; cat $$file >> $@ ; done"
end

#makerule cpuflags   
#	depends	"Makefile.settings" 
#	action	"perl -e 'print \"CPUFLAGS :=\n\"; foreach $$var (split(\" \", $$ENV{VARIABLES})) { if (exists($$ENV{$$var})) { print \"CPUFLAGS += -D$$var\" . (length($$ENV{$$var})?\"=\x27$$ENV{$$var}\x27\":\"\") .\"\n\"} else { print \"CPUFLAGS += -U$$var\n\"} }' > $@"
#end

#makerule ldoptions   
#	depends	"Makefile.settings" 
#	action	"perl -e 'foreach $$var (split(\" \", $$ENV{VARIABLES})) { if ($$ENV{$$var} =~ m/^(0x[0-9a-fA-F]+|0[0-7]+|[0-9]+)$$/) { print \"$$var = $$ENV{$$var};\n\"; }}' > $@"
#end

makerule coreboot.strip  
	depends	"coreboot" 
	action	"$(CONFIG_OBJCOPY) -O binary coreboot coreboot.strip"
end

makerule coreboot.a
        depends "$(OBJECTS)"
        action  "rm -f coreboot.a"
        action  "$(CONFIG_CROSS_COMPILE)ar cr coreboot.a $(OBJECTS)"
end


makerule coreboot_ram.o
	depends	"src/arch/$(CONFIG_ARCH)/lib/c_start.o $(DRIVER) coreboot.a $(LIBGCC_FILE_NAME)" 
	action	"$(CC) $(DISTRO_LFLAGS) -nostdlib -r -o $@ src/arch/$(CONFIG_ARCH)/lib/c_start.o $(DRIVER) -Wl,-\( coreboot.a $(LIBGCC_FILE_NAME) -Wl,-\)"
end

makerule coreboot_ram
	depends	"coreboot_ram.o $(TOP)/src/config/coreboot_ram.ld ldoptions" 
	action	"$(CC) $(DISTRO_LFLAGS) -nostdlib -nostartfiles -static -o $@ -T $(TOP)/src/config/coreboot_ram.ld coreboot_ram.o"
	action 	"$(CONFIG_CROSS_COMPILE)nm -n coreboot_ram | sort > coreboot_ram.map"
end

##
## By default compress the part of coreboot that runs from RAM
##
makedefine COREBOOT_RAM-$(CONFIG_COMPRESS):=coreboot_ram.nrv2b
makedefine COREBOOT_RAM-$(CONFIG_UNCOMPRESSED):=coreboot_ram.bin

makerule coreboot_ram.bin 
	depends	"coreboot_ram" 
	action	"$(CONFIG_OBJCOPY) -O binary $< $@"
end

makerule coreboot_ram.nrv2b 
	depends	"coreboot_ram.bin nrv2b" 
	action	"./nrv2b e $< $@"
end

makerule coreboot_ram.rom
	depends	"$(COREBOOT_RAM-1)" 
	action	"cp $(COREBOOT_RAM-1) coreboot_ram.rom"
end

makedefine COREBOOT_APC:=

if CONFIG_AP_CODE_IN_CAR
	#for ap code in cache

	makerule coreboot_apc.a
		depends "apc_auto.o"
		action  "rm -f coreboot_apc.a"
		action  "$(CONFIG_CROSS_COMPILE)ar cr coreboot_apc.a apc_auto.o"
	end

	makerule coreboot_apc.o
		depends "src/arch/$(CONFIG_ARCH)/lib/c_start.o coreboot_apc.a $(LIBGCC_FILE_NAME)"
        	action  "$(CC) $(DISTRO_LFLAGS) -nostdlib -r -o $@ $^"
	end

	makerule coreboot_apc
		depends "coreboot_apc.o $(TOP)/src/config/coreboot_apc.ld ldoptions"
		action  "$(CC) $(DISTRO_LFLAGS) -nostdlib -nostartfiles -static -o $@ -T $(TOP)/src/config/coreboot_apc.ld coreboot_apc.o"
		action  "$(CONFIG_CROSS_COMPILE)nm -n coreboot_apc | sort > coreboot_apc.map"
	end

	##
	## By default compress the part of coreboot that runs from cache as ram
	##
	makedefine COREBOOT_APC-$(CONFIG_COMPRESS):=coreboot_apc.nrv2b
	makedefine COREBOOT_APC-$(CONFIG_UNCOMPRESSED):=coreboot_apc.bin

	makerule coreboot_apc.bin
		depends "coreboot_apc"
		action  "$(CONFIG_OBJCOPY) -O binary $< $@"
	end

	makerule coreboot_apc.nrv2b
        depends "coreboot_apc.bin nrv2b"
        action  "./nrv2b e $< $@"
	end

	makerule coreboot_apc.rom
		depends "$(COREBOOT_APC-1)"
		action  "cp $(COREBOOT_APC-1) coreboot_apc.rom"
	end

	makedefine COREBOOT_APC:=coreboot_apc.rom

end

makedefine COREBOOT_RAM_ROM:=coreboot_ram.rom

makerule coreboot   
	depends	"crt0.o $(INIT-OBJECTS) $(COREBOOT_APC) $(COREBOOT_RAM_ROM) ldscript.ld"
	action	"$(CC) $(DISTRO_LFLAGS) -nostdlib -nostartfiles -static -o $@ -T ldscript.ld crt0.o $(INIT-OBJECTS)"
	action	"$(CONFIG_CROSS_COMPILE)nm -n coreboot | sort > coreboot.map"
	action 	"$(CONFIG_CROSS_COMPILE)objdump -dS coreboot > coreboot.disasm"	
end

# the buildrom tool
makerule buildrom 
	depends	"$(TOP)/util/buildrom/buildrom.c" 
	action	"$(HOSTCC) -o $@ $<"
end

# Force crt0.s (which has build time version code in it to rebuild every time)
makedefine .PHONY : crt0.s
makerule crt0.s   
	depends	"crt0.S $(CRT0_INCLUDES)" 
	action	"$(CPP) $(CPPFLAGS) -I. -I$(TOP)/src  $< > $@.new && mv $@.new $@"
end

# generate an assembly listing via -a switch.
makerule crt0.o  
	depends	"crt0.s" 
	action	"$(CC) -Wa,-acdlns -c $(CONFIG_CPU_OPT) -o $@ $< >crt0.disasm"
end

makerule etags   
	depends	"$(SOURCES)" 
	action	"etags $(SOURCES)"
end
makerule tags   
	depends	"$(SOURCES)" 
	action	"ctags $(SOURCES)"
end
makerule corebootDoc.config
	depends	"$(TOP)/src/config/corebootDoc.config" 
	action "cat $(TOP)/src/config/corebootDoc.config > corebootDoc.config"
        action "echo 'INPUT=$(SOURCES)' >> corebootDoc.config"
end
makerule documentation   
	depends	"corebootDoc.config"
	action	"doxygen corebootDoc.config"
end

# Yes, the rule doesn't seem to make sense, but multiple images could try to
# create a romcc binary at the same time, clobbering each other.
# Our makefile architecture won't allow us to easily have the romcc target
# in the main makefile, so keep it here and move the race condition winner
# in place. That way, romcc may get compiled twice, but the binary will always
# be in a correct and valid state if it exists because the move is atomic.
makerule ../romcc   
	depends	"$(TOP)/util/romcc/romcc.c" 
	action	"$(HOSTCC) -g $(HOSTCFLAGS) $< -o romcc.tmpfile"
	action	"mv romcc.tmpfile $@"
end

makerule build_opt_tbl   
	depends	"$(TOP)/util/options/build_opt_tbl.c $(TOP)/src/include/pc80/mc146818rtc.h $(TOP)/src/include/boot/coreboot_tables.h Makefile.settings Makefile"
	action	"$(HOSTCC) $(HOSTCFLAGS) $(CPUFLAGS) $< -o $@" 
end

makerule option_table.h option_table.c
	depends	"build_opt_tbl $(CONFIG_MAINBOARD)/cmos.layout" 
	action	"./build_opt_tbl --config $(CONFIG_MAINBOARD)/cmos.layout --header option_table.h --option option_table.c"
end

if CONFIG_HAVE_OPTION_TABLE
object ./option_table.o 
end

makerule clean 
	action  "rm -f $(OBJECTS)"
	action  "rm -f $(DRIVER)"
	action	"rm -f coreboot.* *~"
	action	"rm -f coreboot"
	action	"rm -f ldscript.ld"
	action	"rm -f a.out *.s *.l *.o *.E *.inc"
	action	"rm -f TAGS tags romcc*"
	action	"rm -f docipl buildrom* chips.c *chip.c coreboot_apc* coreboot_ram* coreboot_pay*"
	action	"rm -f build_opt_tbl* nrv2b* option_table.c option_table.h crt0.S crt0.disasm"
	action	"rm -f smm smm.elf smm.map smm_bin.c"
	action	"rm -f dsdt.aml dsdt.c"
	action	"rm -f payload"
end

# do standard config files that the user need not specify
# for now, this is just 'lib', but it may be more later. 
dir /lib
dir /console
dir /stream
dir /devices
dir /pc80
dir /boot