# this is an openwrt variable
TOPDIR := $(shell cd ..; pwd)/openwrt
include $(TOPDIR)/rules.mk

CC :=       $(KERNEL_CROSS)gcc
LD :=       $(KERNEL_CROSS)ld
OBJCOPY :=  $(KERNEL_CROSS)objcopy
OBJDUMP :=  $(KERNEL_CROSS)objdump
LZMA :=     $(STAGING_DIR)/bin/lzma

# this would be better if it did 'cd ..', but that is slow
MERAKI_VERSION := 560  #$(shell svnversion)
BUILD_DIR := build_$(BOARD)
BUILD_DIRECTORIES += $(BUILD_DIR)
ROOT_DIR := $(BUILD_DIR)/root

PREPARE_STAMP := $(BUILD_DIR)/prepare-STAMP

LINUX_VERSION:=2.6.16.16

LINUX_DIR := $(shell cd ..; pwd)/linux-$(LINUX_VERSION)
MADWIFI_DIR :=  $(shell cd ..; pwd)/madwifi-ng
BASE_FILES_DIR :=  $(shell cd ..; pwd)/base-files

LINUX_BUILD_DIR:= $(BUILD_DIR)/linux
BUILD_DIRECTORIES += $(LINUX_BUILD_DIR)
LINUX_KERNEL := $(LINUX_DIR)/vmlinux
ifeq ($(BOARD), x86)
LINUX_KARCH := i386
else
LINUX_KARCH := mips
endif

LINUX_BUILD_ARGS := \
	CROSS_COMPILE="$(KERNEL_CROSS)" \
	ARCH="$(LINUX_KARCH)" \
	PATH="$(TARGET_PATH)" \
	INSTALL_MOD_PATH="$(shell pwd)/$(ROOT_DIR)" \
	O="$(shell pwd)/$(LINUX_BUILD_DIR)"

all:

.SUFFIXES:

include ../base-files/Makefile.inc
include stage2/Makefile.inc
include $(BOARD)/Makefile.inc

../openwrt/BUILD_DONE:
	$(MAKE) -C ../openwrt oldconfig
	$(MAKE) -C ../openwrt V=99
	touch $@

menuconfig: $(LINUX_BUILD_DIR)/.config
	$(MAKE) -C $(LINUX_DIR) $(LINUX_BUILD_ARGS) menuconfig

$(LINUX_BUILD_DIR)/.config: $(TOPDIR)/target/linux/$(BOARD)-2.6/config
	mkdir -p $(LINUX_BUILD_DIR)
	cp $< $@
	$(MAKE) -C $(LINUX_DIR) $(LINUX_BUILD_ARGS) oldconfig

# these commands were clearly stolen from the linux build structure.
# If the kernel configuration is ever changed to the point where these
# commands change then they need to be updated.
ifeq ($(BOARD),ar531x)
KERNEL_GCC_ARCH_OPTS := -isystem $(STAGING_DIR)/lib/gcc/mips-linux-uclibc/3.4.6/include -mno-abicalls -fno-pic -msoft-float -mabi=32 -march=r4600 -Wa,-32 -Wa,-march=r4600 -Wa,-mips3 -Wa,--trap -I$(LINUX_DIR)/include/asm-mips/mach-atheros -Iinclude/asm-mips/mach-atheros -I$(LINUX_DIR)/include/asm-mips/mach-generic -Iinclude/asm-mips/mach-generic
KERNEL_LD_ARCH_OPTS1 := -m elf32btsmip 
KERNEL_LD_ARCH_OPTS2 := -T arch/mips/kernel/vmlinux.lds arch/mips/kernel/head.o arch/mips/kernel/init_task.o  init/built-in.o --start-group  usr/built-in-meraki.o  arch/mips/ar531x/built-in.o  arch/mips/kernel/built-in.o  arch/mips/mm/built-in.o  arch/mips/math-emu/built-in.o  kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o  crypto/built-in.o  block/built-in.o  lib/lib.a  arch/mips/lib/lib.a  arch/mips/lib-32/lib.a  lib/built-in.o  arch/mips/lib/built-in.o  arch/mips/lib-32/built-in.o  drivers/built-in.o  sound/built-in.o  arch/mips/oprofile/built-in.o  net/built-in.o --end-group .tmp_kallsyms2.o
endif
ifeq ($(BOARD),brcm)
KERNEL_GCC_ARCH_OPTS := -isystem $(STAGING_DIR)/lib/gcc/mipsel-linux-uclibc/3.4.6/include -mno-abicalls -fno-pic -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_DIR)/arch/mips/bcm947xx/include -Iarch/mips/bcm947xx/include -I$(LINUX_DIR)/include/asm-mips/mach-generic -Iinclude/asm-mips/mach-generic
KERNEL_LD_ARCH_OPTS1 := -m elf32ltsmip 
KERNEL_LD_ARCH_OPTS2 := -T arch/mips/kernel/vmlinux.lds arch/mips/kernel/head.o arch/mips/kernel/init_task.o  init/built-in.o --start-group  usr/built-in-meraki.o  arch/mips/bcm947xx/built-in.o  arch/mips/bcm947xx/broadcom/built-in.o  arch/mips/kernel/built-in.o  arch/mips/mm/built-in.o  arch/mips/math-emu/built-in.o  kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o  crypto/built-in.o  block/built-in.o  lib/lib.a  arch/mips/lib/lib.a  arch/mips/lib-32/lib.a  lib/built-in.o  arch/mips/lib/built-in.o  arch/mips/lib-32/built-in.o  drivers/built-in.o  sound/built-in.o  arch/mips/pci/built-in.o  net/built-in.o --end-group .tmp_kallsyms2.o
endif


$(LINUX_BUILD_DIR)/usr/built-in-meraki.o: $(LINUX_BUILD_DIR)/rootlist
	cd $(LINUX_BUILD_DIR) && \
	./usr/gen_init_cpio rootlist > usr/initramfs_data_meraki.cpio && \
	$(KERNEL_CROSS)gcc -Wp,-MD,usr/.initramfs_data.o.d  -nostdinc  -D__KERNEL__ -Iinclude -Iinclude2 $(KERNEL_GCC_ARCH_OPTS) -I$(LINUX_DIR)/include -include include/linux/autoconf.h -D__ASSEMBLY__ -G 0 -pipe  -c -o usr/initramfs_data_meraki.o $(LINUX_DIR)/usr/initramfs_data_meraki.S && \
	$(KERNEL_CROSS)ld $(KERNEL_LD_ARCH_OPTS1) -r -o usr/built-in-meraki.o usr/initramfs_data_meraki.o

$(LINUX_BUILD_DIR)/vmlinux-meraki: $(LINUX_BUILD_DIR)/vmlinux $(LINUX_BUILD_DIR)/usr/built-in-meraki.o
	cd $(LINUX_BUILD_DIR) && \
	$(KERNEL_CROSS)ld $(KERNEL_LD_ARCH_OPTS1) -G 0 -static -n -nostdlib -o vmlinux-meraki $(KERNEL_LD_ARCH_OPTS2)

ifeq ($(BOARD), x86)
$(LINUX_BUILD_DIR)/bzImage $(LINUX_BUILD_DIR)/vmlinux: $(LINUX_BUILD_DIR)/rootlist $(LINUX_BUILD_DIR)/.config FORCE
else
#on non-x86, the rootlist is compiled in separately above
$(LINUX_BUILD_DIR)/vmlinux: $(LINUX_BUILD_DIR)/.config FORCE
endif

FORCE:

$(LINUX_BUILD_DIR)/%: $(LINUX_BUILD_DIR)/.config $(PREPARE_STAMP)
	mkdir -p $(LINUX_BUILD_DIR)
	$(MAKE) -C $(LINUX_DIR) $(LINUX_BUILD_ARGS) $(patsubst $(LINUX_BUILD_DIR)/%,%,$@)

$(LINUX_BUILD_DIR)/rootlist: ../openwrt/BUILD_DONE rootfs_cleaned
	cd $(LINUX_BUILD_DIR) && find . -name \*.ko -exec cp {} ../../$(ROOT_DIR)/lib/modules/ \;
	cd $(ROOT_DIR) && find . -not -type d -exec bash -c "[ -f /m/ru/openwrt/build_$(ARCH)/root/{} ] && echo deleting openwrt version of {} && rm /m/ru/openwrt/build_$(ARCH)/root/{}" \;
	bash $(LINUX_DIR)/scripts/gen_initramfs_list.sh -u `id -u` -g `id -g` \
		$(TOPDIR)/build_$(ARCH)/root > $@
	bash $(LINUX_DIR)/scripts/gen_initramfs_list.sh -u `id -u` -g `id -g` \
		$(shell pwd)/$(ROOT_DIR) >> $@
	cat devices-to-rootlist.txt >> $@

.PHONY: linux-menuconfig
linux-menuconfig: $(LINUX_BUILD_DIR)/.config
	$(MAKE) -C $(LINUX_DIR) O="$(LINUX_BUILD_DIR)" menuconfig
	cp $< $(TOPDIR)/target/linux/$(BOARD)-2.6/config

#$(LINUX_BUILD_DIR)/.config: $(TOPDIR)/target/linux/$(BOARD)-2.6/config
#	mkdir -p $(LINUX_BUILD_DIR)
#	cp $< $@
#	$(MAKE) -C $(LINUX_DIR) O="$(LINUX_BUILD_DIR)" oldconfig > /dev/null

#should be a check for if we need AHB or not, and should maybe be put in madwifi
ifeq ($(BOARD), brcm)
MADWIFI_ARCH := mips-le-elf
MADWIFI_BUS := PCI
endif
ifeq ($(BOARD), ar531x)
MADWIFI_ARCH := ap51
MADWIFI_BUS := AHB
endif
ifeq ($(BOARD), x86)
MADWIFI_ARCH := i386-elf
MADWIFI_BUS := PCI
endif
MADWIFI_BUILD_ARGS := \
	CROSS_COMPILE=$(KERNEL_CROSS) \
	ARCH=$(LINUX_KARCH) \
	PATH=$(TARGET_PATH) \
	INSTALL_MOD_PATH="$(shell pwd)/$(ROOT_DIR)" \
	TARGET="$(MADWIFI_ARCH)" \
	TOOLPREFIX=$(KERNEL_CROSS) \
	TOOLPATH=$(KERNEL_CROSS) \
	KERNELPATH="$(shell pwd)/$(LINUX_BUILD_DIR)" \
	BUS="$(MADWIFI_BUS)"

rootfs: madwifi
.PHONY: madwifi
madwifi: $(PREPARE_STAMP) $(LINUX_BUILD_DIR)/modules
	make -C $(MADWIFI_DIR) $(MADWIFI_BUILD_ARGS) all
	cp $(MADWIFI_DIR)/ath/ath_???.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/ath_hal/ath_hal.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/ath_rate/sample/ath_rate_sample.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_ccmp.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_acl.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_tkip.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_xauth.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_wep.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_scan_ap.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/net80211/wlan_scan_sta.ko $(ROOT_DIR)/lib/modules/
	cp $(MADWIFI_DIR)/tools/{madwifi_multi,80211debug,80211stats,athchans,athctrl,athdebug,athkey,athstats,wlanconfig} $(ROOT_DIR)/usr/sbin/
	$(RSTRIP) $(ROOT_DIR)/usr/sbin/{madwifi_multi,80211debug,80211stats,athchans,athctrl,athdebug,athkey,athstats,wlanconfig}
	$(KERNEL_CROSS)strip --strip-unneeded $(ROOT_DIR)/lib/modules/*.ko

rootfs:

# not sure if this is enough
.MUTEX: $(LINUX_BUILD_DIR)/vmlinux $(LINUX_BUILD_DIR)/modules $(CLICK_MODULES) madwifi

# it is much easier if we just do this every time, rather than having
# to rebuild everything just because someone removed $(BUILD_DIR)/root
$(shell mkdir -p $(ROOT_DIRECTORIES))
$(shell mkdir -p $(BUILD_DIRECTORIES))

$(PREPARE_STAMP): ../openwrt/BUILD_DONE
	touch $@

clean:
	$(MAKE) -C $(MADWIFI_DIR) $(MADWIFI_BUILD_ARGS) clean
