#
#  TOPPERS/JSP Kernel
#      Toyohashi Open Platform for Embedded Real-Time Systems/
#      Just Standard Profile Kernel
# 
#  Copyright (C) 2000,2001 by Embedded and Real-Time Systems Laboratory
#                              Toyohashi Univ. of Technology, JAPAN
# 
#  嵭ԤϡFree Software Foundation ˤäƸɽƤ 
#  GNU General Public License  Version 2 ˵ҤƤ狼
#  ξΤ줫˸¤ꡤܥեȥܥեȥ
#  ѤΤޤࡥʲƱˤѡʣѡۡʰʲ
#  ѤȸƤ֡ˤ뤳Ȥ̵ǵ롥
#  (1) ܥեȥ򥽡ɤηѤˤϡ嵭
#      ɽѾ浪Ӳ̵ݾڵ꤬Τޤޤηǥ
#      ˴ޤޤƤ뤳ȡ
#  (2) ܥեȥѲǽʥХʥꥳɡʥ֥륪
#      ȥե饤֥ʤɡˤηѤˤϡ
#      ȼɥȡѼԥޥ˥奢ʤɡˤˡ嵭ɽ
#      Ѿ浪Ӳ̵ݾڵǺܤ뤳ȡ
#  (3) ܥեȥԲǽʥХʥꥳɤηޤϵ
#      ߹ѤˤϡΤ줫ξȡ
#    (a) ѤȼɥȡѼԥޥ˥奢ʤɡˤˡ嵭
#        ɽѾ浪Ӳ̵ݾڵǺܤ뤳ȡ
#    (b) Ѥη֤̤ˡˤäơ嵭Ԥ𤹤
#        ȡ
#  (4) ܥեȥѤˤľŪޤϴŪ뤤ʤ»
#      ⡤嵭Ԥդ뤳ȡ
# 
#  ܥեȥϡ̵ݾڤ󶡤ƤΤǤ롥嵭Ԥϡ
#  ܥեȥ˴ؤơŬѲǽޤơʤݾڤԤ
#  ʤޤܥեȥѤˤľŪޤϴŪ
#  ʤ»˴ؤƤ⡤Ǥʤ
# 
#  @(#) $Id: Makefile,v 1.13 2001/11/12 13:14:45 hiro Exp $
# 

#
#  å̾
#
CPU = @(CPU)
SYS = @(SYS)

#
#  եΥǥ쥯ȥ
#
JSPDIR = @(JSPDIR)

#
#  Cygwinǥѥ뤹뤫ɤ
#
#CYGWIN = true

#
#  ¹ԴĶʣμ¹ԴĶƱ򤷤ƤϤʤʤ
#		 ʤɤˤ⳺ʤϡ٤ƥȥȤ
#
GDB_STUB = true
#PARTNER_J = true

#
#  åȰ¸Υ󥯥롼
#
-include $(JSPDIR)/config/$(CPU)/Makefile.config
ifdef SYS
    -include $(JSPDIR)/config/$(CPU)/$(SYS)/Makefile.config
endif

#
#  ̥ѥ륪ץ
#
INCLUDES = -I. -I$(JSPDIR)/include -I$(JSPDIR)/config/$(CPU) \
			-I$(JSPDIR)/config/$(CPU)/$(SYS)
CDEFS = $(CPU_CDEFS) $(SYS_CDEFS) $(ENV_CDEFS)
CFLAGS = $(CPU_CFLAGS) $(SYS_CFLAGS) $(CDEFS) $(INCLUDES) -g -Wall
LDFLAGS = -nostdlib $(CPU_LDFLAGS) $(SYS_LDFLAGS)
LIBS = $(CPU_LIBS) $(SYS_LIBS) -lgcc

#
#  ץꥱץ˴ؤ
#
UNAME = @(UNAME)
UTASK_CFG = $(UNAME).cfg

UTASK_DIR = $(JSPDIR)/libjsp
UTASK_ASMOBJS =
UTASK_COBJS = $(UNAME).o @(UTASK)
UTASK_CFLAGS =
UTASK_LIBS =

#
#  ƥॵӥ˴ؤ
#
STASK_DIR = $(JSPDIR)/systask:$(JSPDIR)/libjsp
STASK_ASMOBJS =
STASK_COBJS = timer.o serial.o logtask.o \
	      vasyslog.o jsp_perror.o strerror.o
STASK_CFLAGS = -I$(JSPDIR)/systask
STASK_LIBS =

#
#  ͥ˴ؤ
#
#  KERNEL_ASMOBJS: ͥ饤֥˴ޤ롤֥
#		   ֥ȥե롥
#  KERNEL_COBJS: ͥΥ饤֥˴ޤ롤CΥ֥
#		 ȥե롥
#  KERNEL_ADD_COBJS: ͥΥ饤֥˴ޤ᤺ɥ⥸塼ľ
#		     ܥ󥯤륽CΥ֥ȥե롥
#  KERNEL_AUX_COBJS: ɥ⥸塼˴ޤʤͥΥե
#		     ƱץŬѤƥѥ뤹٤ե
#		     롥
#
KERNEL = $(JSPDIR)/kernel
KERNEL_DIR = $(JSPDIR)/config/$(CPU):$(JSPDIR)/config/$(CPU)/$(SYS):$(KERNEL)
KERNEL_ASMOBJS = cpu_support.o sys_support.o
KERNEL_COBJS = startup.o cpu_config.o sys_config.o \
	       task.o wait.o time_event.o syslog.o \
	       task_manage.o task_sync.o task_except.o \
	       semaphore.o eventflag.o dataqueue.o mailbox.o mempfix.o \
	       time_manage.o cyclic.o sys_manage.o interrupt.o exception.o
KERNEL_ADD_COBJS = banner.o kernel_cfg.o
KERNEL_AUX_COBJS = makeoffset.o kernel_chk.o
KERNEL_CFLAGS = -I$(KERNEL)

#
#  ȥåץ⥸塼˴ؤ
#
ifndef START_OBJS
    START_OBJS = start.o
endif

#
#  ֥ȥե̾Cygwin Ǥ .exe դ
#
ifneq ($(CYGWIN),true)
    JSPOBJ = jsp
else
    JSPOBJ = jsp.exe
endif

#
#  åȥեʣƱ򤷤ƤϤʤʤ
#
all: $(JSPOBJ)
#all: jsp.out
#all: jsp.bin
#all: jsp.S

#
#  ͥΥե졼ե
#
kernel_cfg.c kernel_id.h kernel_chk.c: $(UTASK_CFG)
	$(CPP) $(INCLUDES) $(CDEFS) $(UTASK_CFG) | $(JSPDIR)/cfg/cfg -c

##### ʲԽʤ #####

#
#  Ķ˰¸륳ѥ륪ץ
#
ifeq ($(GDB_STUB),true)
    ENV_CDEFS = -DGDB_STUB
else
ifeq ($(PARTNER_J),true)
    ENV_CDEFS = -DPARTNER_J
endif
endif

#
#  jsp.chk §ŪAPIΥѥ᡼å
#
jsp.chk: kernel_chk.s $(JSPDIR)/utils/gencheck
	$(JSPDIR)/utils/gencheck kernel_chk.s > jsp.chk

#
#  offset.h §ʹ¤ΥեåͤλС
#
offset.h: makeoffset.s $(JSPDIR)/utils/genoffset
	$(JSPDIR)/utils/genoffset makeoffset.s > offset.h

#
#  եΤǥ쥯ȥ˴ؤ
#
vpath %.c $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR)
vpath %.S $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR)

#
#  ѥΤѿ
#
KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS)
STASK_OBJS = $(STASK_ASMOBJS) $(STASK_COBJS)
UTASK_OBJS = $(UTASK_ASMOBJS) $(UTASK_COBJS)
ALL_OBJS = $(START_OBJS) $(KERNEL_ADD_COBJS) $(STASK_OBJS) $(UTASK_OBJS)
ALL_LIBS = $(STASK_LIBS) $(UTASK_LIBS) libkernel.a $(LIBS)

ifdef TEXT_START_ADDRESS
    LDFLAGS := $(LDFLAGS) -Wl,-Ttext,$(TEXT_START_ADDRESS)
endif
ifdef DATA_START_ADDRESS
    LDFLAGS := $(LDFLAGS) -Wl,-Tdata,$(DATA_START_ADDRESS)
endif
ifdef LDSCRIPT
    LDFLAGS := $(LDFLAGS) -T $(JSPDIR)/config/$(LDSCRIPT)
endif

#
#  ̤ʰ¸ط
#
banner.o: Makefile $(filter-out banner.o,$(ALL_OBJS)) libkernel.a

#
#  ͥ饤֥ե
#
libkernel.a: $(KERNEL_LIB_OBJS)
	rm -f libkernel.a
	$(AR) -rcs libkernel.a $(KERNEL_LIB_OBJS)

#
#  ΤΥ
#
$(JSPOBJ): Makefile.depend $(ALL_OBJS) libkernel.a jsp.chk
	$(CC) $(CFLAGS) $(LDFLAGS) -o jsp $(ALL_OBJS) $(ALL_LIBS)
	$(JSPDIR)/cfg/$(TARGET_PREFIX)chk $(JSPOBJ) jsp.chk

#
#  PARTNER-J ΤΥե
#
jsp.out: $(JSPOBJ)
	cp $(JSPOBJ) jsp.out

#
#  Хʥե
#
jsp.bin: $(JSPOBJ)
	$(OBJCOPY) -O binary -S $(JSPOBJ) jsp.bin

#
#  S쥳ɥե
#
jsp.S: $(JSPOBJ)
	$(OBJCOPY) -O srec -S $(JSPOBJ) jsp.S

#
#  ѥ̤ξõ
#
clean:
	rm -f \#* *~ *.o
	rm -f libkernel.a jsp jsp.chk jsp.exe jsp.bin jsp.out jsp.S
	rm -f kernel_cfg.c kernel_chk.c kernel_chk.s kernel_id.h
	rm -f makeoffset.s offset.h

cleandep:
	rm -f Makefile.depend

realclean: cleandep clean

#
#  ¸طե
#
depend: kernel_cfg.c offset.h
	rm -f Makefile.depend
	$(JSPDIR)/utils/makedep -P $(CPP) \
		-T "kernel_cfg.c kernel_id.h kernel_chk.c" \
		-O "$(INCLUDES)" $(UTASK_CFG) \
		>> Makefile.depend
	$(JSPDIR)/utils/makedep -C $(CC) -S $(KERNEL_DIR) \
		-O "$(CFLAGS) $(KERNEL_CFLAGS)" \
		$(KERNEL_ASMOBJS:.o=.S) $(KERNEL_ADD_COBJS:.o=.c) \
		$(KERNEL_COBJS:.o=.c) >> Makefile.depend
	$(JSPDIR)/utils/makedep -C $(CC) -S $(KERNEL_DIR) \
		-O "$(CFLAGS) $(KERNEL_CFLAGS)" \
		-s makeoffset.c >> Makefile.depend
	$(JSPDIR)/utils/makedep -C $(CC) -S $(KERNEL_DIR) \
		-O "$(CFLAGS) $(KERNEL_CFLAGS)" \
		-s kernel_chk.c >> Makefile.depend
	$(JSPDIR)/utils/makedep -C $(CC) -S $(STASK_DIR) \
		-O "$(CFLAGS) $(STASK_CFLAGS)" \
		$(STASK_ASMOBJS:.o=.S) $(STASK_COBJS:.o=.c) \
		>> Makefile.depend
	$(JSPDIR)/utils/makedep -C $(CC) -S $(UTASK_DIR) \
		-O "$(CFLAGS) $(UTASK_CFLAGS)" \
		$(UTASK_ASMOBJS:.o=.S) $(UTASK_COBJS:.o=.c) \
		>> Makefile.depend

#
#  ¸طե򥤥󥯥롼
#
-include Makefile.depend

#
#  ѥɥ饤Ф
#
ifdef TARGET
    TARGET_PREFIX = $(TARGET)-
else
    TARGET_PREFIX = 
endif
CC = @(PREFIX)/bin/$(TARGET_PREFIX)gcc
AS = @(PREFIX)/bin/$(TARGET_PREFIX)as
LD = @(PREFIX)/bin/$(TARGET_PREFIX)ld
AR = @(PREFIX)/bin/$(TARGET_PREFIX)ar
NM = @(PREFIX)/bin/$(TARGET_PREFIX)nm
RANLIB = @(PREFIX)/bin/$(TARGET_PREFIX)ranlib
OBJCOPY = @(PREFIX)/bin/$(TARGET_PREFIX)objcopy
OBJDUMP = @(PREFIX)/bin/$(TARGET_PREFIX)objdump

#
#  CץץåΥޥ̾
#
CPP = $(shell $(CC) -print-prog-name=cpp)

#
#  ѥ롼
#
KERNEL_ALL_COBJS = $(KERNEL_COBJS) $(KERNEL_ADD_COBJS) $(KERNEL_AUX_COBJS)

$(START_OBJS): %.o: %.S
	$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<

$(KERNEL_ALL_COBJS): %.o: %.c
	$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<

$(KERNEL_ALL_COBJS:.o=.s): %.s: %.c
	$(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $<

$(KERNEL_ASMOBJS): %.o: %.S
	$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<

$(STASK_COBJS): %.o: %.c
	$(CC) -c $(CFLAGS) $(STASK_CFLAGS) $<

$(STASK_COBJS:.o=.s): %.s: %.c
	$(CC) -S $(CFLAGS) $(STASK_CFLAGS) $<

$(STASK_ASMOBJS): %.o: %.S
	$(CC) -c $(CFLAGS) $(STASK_CFLAGS) $<

$(UTASK_COBJS): %.o: %.c
	$(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $<

$(UTASK_COBJS:.o=.s): %.s: %.c
	$(CC) -S $(CFLAGS) $(UTASK_CFLAGS) $<

$(UTASK_ASMOBJS): %.o: %.S
	$(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $<

#
#  ǥեȥѥ롼
#
%.o: %.c
	@echo "*** Default compile rules should not be used."
	$(CC) -c $(CFLAGS) $<

%.s: %.c
	@echo "*** Default compile rules should not be used."
	$(CC) -S $(CFLAGS) $<

%.o: %.S
	@echo "*** Default compile rules should not be used."
	$(CC) -c $(CFLAGS) $<
