# RTLINUX make file
# This makefile was constructed by butchering the linux makefile
# and hoping that someone else would make a better version soon.
# (C) Victor Yodaiken. August 1 1998
# Released under the GPL
# Various features added by Michael Barabanov

LINUX_KERNEL_DIR=linux

CC=gcc
MOD_DIR=../modules
ABSPATH := $(shell cd ../; pwd)
RTL := $(shell  pwd)
RTLINUX = $(ABSPATH)/$(LINUX_KERNEL_DIR)

KERNELRELEASE=`grep UTS_RELEASE $(RTLINUX)/include/linux/version.h 2>/dev/null | cut -d\" -f2`
# KERNELRELEASE :=$(shell uname -r)

MODFLAGS = -include ${RTLINUX}/include/$(LINUX_KERNEL_DIR)/version.h
# EXAMPLE_DIRS = $(shell ls examples | grep -v CVS)
EXAMPLE_DIRS = hello fp frank sound  measurements regression mmap compat/fp compat/frank compat/measurements compat/sound compat/parallel
DRIVER_DIRS = rt_com mbuff rt_printk
MODULE_DIRS =  fifos schedulers system
# semaphores
# TODO deleted semaphores from above list
NEEDS_PATHS_DIRS =  $(EXAMPLE_DIRS) $(MODULE_DIRS)
RTL_PATH_COMMAND := "RTL_DIR = $(RTL)"
RTLINUX_PATH_COMMAND := "RTLINUX_DIR = $(RTLINUX)"
INCLUDE = "-I$(RTLINUX)/include -I$(RTL)/include -I$(RTL)"
INCLUDE_EMU = "-I$(RTLINUX)/include -I$(RTL)"
INCLUDE_COMMAND := "INCLUDE= $(INCLUDE)"
ARCH = i386
MAKE	=make


MAN_INSTDIR=/usr/local/man
MOD_INSTDIR=/lib/modules/$(KERNELRELEASE)
# MOD_INSTDIR=/lib/modules/$(VERSION).$(PATCHLEVEL).$(SUBLEVEL).RTL2.$(RTPATCH)
INC_INSTDIR=/usr/include/rtlinux

.EXPORT_ALL_VARIABLES:

include $(RTLINUX)/.config

# INSTALL_PATH specifies where to place the updated kernel and system map
# images.  Uncomment if you want to place them anywhere other than root.

INSTALL_PATH=/boot

# standard CFLAGS

# CFLAGS = $(INCLUDE) -I$(RTL)/include/posix -Wall -Wstrict-prototypes -O2
CFLAGS = $(INCLUDE) -I$(RTL)/include/posix -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

ifdef CONFIG_SMP
CFLAGS += -D__SMP__
AFLAGS += -D__SMP__
endif

CFLAGS += -D__RTL__ -D__KERNEL__ -DMODULE
include schedulers/$(ARCH)/Makefile

ifdef CONFIG_MODVERSIONS
CFLAGS += -DMODVERSIONS -include $(RTLINUX)/include/linux/modversions.h
endif

COMPILE_MODULE_COMMAND  = "CFLAGS = $(CFLAGS)"

default:	all

rtl.mk: $(RTLINUX)/.config 
	@echo "#Automatically generated by rtl Makefile"  > rtl.mk;
	@echo  $(RTL_PATH_COMMAND) >> rtl.mk;
	@echo  $(RTLINUX_PATH_COMMAND) >> rtl.mk;
	@echo  $(INCLUDE_COMMAND) >> rtl.mk;
	@echo  $(COMPILE_MODULE_COMMAND) >> rtl.mk;
	@echo  ARCH = $(ARCH) >> rtl.mk;
	@echo  CC = $(CC) >> rtl.mk;
	@echo  RTL_MODULES=$(MOD_INSTDIR)/misc >> rtl.mk;

devices: dummy
	@echo
	@echo -n "Testing for the mbuff device... "
	@if [ ! -e /dev/mbuff ]; then \
	   mknod /dev/mbuff c 10 254 && echo "mknod /dev/mbuff c 10 254"; \
	else \
	   echo "already existent."; \
	fi
	@echo -n "Testing for FIFOs... "
	@if [ ! -e /dev/rtf0 ]; then \
		for i in 0 1 2 3 4 5 6 7; do \
			mknod /dev/rtf$$i c 150 $$i; \
		done; \
		echo "created /dev/rtf0 - 7 (major 150)"; \
	else \
	   echo "already existent."; \
	fi
	@echo

modules: rtl.mk
	@set -e;
	@for i in $(MODULE_DIRS); do \
	cp rtl.mk $$i;\
	$(MAKE) -C  $$i; \
	done;

drivers: rtl.mk
	@set -e
	@echo
	@echo "Now updating Makefiles for the drivers"
	@for i in $(DRIVER_DIRS); do\
	$(MAKE) -C  drivers/$$i RTL=RTL; \
	done

config: rtl.mk
	@echo Kernel version $(KERNELRELEASE)
	rm -f include/arch
	ln -s arch-$(ARCH) include/arch
	rm -f include/linux include/asm # for compatibility
	ln -s arch-$(ARCH) include/asm
	ln -s arch-$(ARCH) include/linux
	@echo Updating configuration
	sh misc/updateconf
	@for i in $(DRIVER_DIRS); do\
		cp rtl.mk drivers/$$i;\
	done
	@set -e;
	@for i in $(MODULE_DIRS); do \
		cp rtl.mk $$i;\
	done;
	@set -e
	@echo
	@for i in $(EXAMPLE_DIRS); do\
		cp rtl.mk examples/$$i;\
	done


checkconfig:
	@if [ ! -e $(RTLINUX)/.config ]; then \
		echo Please configure the Linux kernel first; \
		exit 1; \
	fi
ifdef CONFIG_MODVERSIONS
	@if [ ! -e $(RTLINUX)/include/linux/modversions.h ]; then \
		echo Please run make dep in the Linux kernel source first; \
		exit 1; \
	fi
endif
ifdef CONFIG_APM
	@echo Warning: APM support is enabled. Real-time performance may be degraded. Please consider disabling APM.
endif
ifndef CONFIG_RTL
	@echo You need to enable hard realtime support (CONFIG_RTL) in the kernel
	@exit 1
endif

all: checkconfig config modules drivers
	@echo
	@echo 'Now you need to become root and do "make install"'


checkroot: dummy
	@if [ ! -O / ]; then \
		echo ; \
		echo Sorry you need to be root for that; \
		echo ; \
		exit 1; \
	fi

install: checkroot devices
	@echo
	@-mkdir -p $(MOD_INSTDIR)
	@-mkdir -p $(MOD_INSTDIR)/misc
	@echo "Instaling modules in" $(MOD_INSTDIR)/misc
	@for mod in drivers/mbuff/mbuff.o fifos/rtl_fifo.o schedulers/rtl_sched.o schedulers/rtl_time.o system/rtl_posixio.o drivers/rt_com/rt_com.o; do \
	   install -c -m 644 $$mod $(MOD_INSTDIR)/misc; \
	done
	-/sbin/depmod -a
	@echo "Installing man pages to" $(MAN_INSTDIR)
	@for d in 3 4; do \
		if [ ! -d $(MAN_INSTDIR)/man$$d ]; then \
			mkdir -p $(MAN_INSTDIR)/man$$d; \
		fi; \
		for i in man/man$$d/*$$d; do \
			install -m 644 $$i $(MAN_INSTDIR)/man$$d; \
		done \
	done
	@echo "Installing header" $(INC_INSTDIR)
	@mkdir -p $(INC_INSTDIR)/arch-$(ARCH)
	@for head in include/*.h drivers/rt_com/rt_com.h; do \
	   install -c -m 644 $$head $(INC_INSTDIR); \
	done
	install -c -m 644 rtl.mk $(INC_INSTDIR);
	@for head in include/arch-$(ARCH)/*.h; do \
	   install -c -m 644 $$head $(INC_INSTDIR)/arch-$(ARCH); \
	done
	@rm -f $(INC_INSTDIR)/arch
	@ln -s arch-$(ARCH) $(INC_INSTDIR)/arch
	@rm -f $(INC_INSTDIR)/linux $(INC_INSTDIR)/asm
	@ln -s arch-$(ARCH) $(INC_INSTDIR)/linux  # compatibility
	@ln -s arch-$(ARCH) $(INC_INSTDIR)/asm    # compatibility
	@echo

clean: config
	@set -e; \
        for i in $(EXAMPLE_DIRS); do \
           $(MAKE) -C examples/$$i clean; \
        done; \
        for i in $(DRIVER_DIRS); do \
           $(MAKE) -C drivers/$$i clean; \
        done; \
        for i in $(MODULE_DIRS); do \
	   $(MAKE) -C  $$i clean ; \
	done; \
	rm -f modules/*.o

mrproper: clean
	find . -name rtl.mk |xargs rm -f

.PHONY: dummy drivers modules semaphores

