#
#  TOPPERS/JSP Kernel
#      Toyohashi Open Platform for Embedded Real-Time Systems/
#      Just Standard Profile Kernel
# 
#  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
#                              Toyohashi Univ. of Technology, JAPAN
#  Copyright (C) 2003-2004 by Naoki Saito
#             Nagoya Municipal Industrial Research Institute, JAPAN
# 
#  上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation 
#  によって公表されている GNU General Public License の Version 2 に記
#  述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
#  を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
#  利用と呼ぶ）することを無償で許諾する．
#  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
#      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
#      スコード中に含まれていること．
#  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
#      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
#      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
#      の無保証規定を掲載すること．
#  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
#      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
#      と．
#    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
#        作権表示，この利用条件および下記の無保証規定を掲載すること．
#    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
#        報告すること．
#  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
#      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
# 
#  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
#  よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
#  含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
#  接的または間接的に生じたいかなる損害に関しても，その責任を負わない．
# 
#  @(#) $Id: Makefile.m32c-oaks32,v 1.2 2005/12/06 03:06:03 honda Exp $
# 

#
#  ターゲットの指定（Makefile.config で上書きされるのを防ぐため）
#
all:

#
#  ターゲット名の定義
#
CPU = m32c
SYS = oaks32
TOOL = renesas

#
#	ターゲットシステム依存の定義
#

#
# アドレス設定(末尾の"h"は付けなくて良い)
#
# ISPの初期値
RAMEND = 07800
# RAMの先頭番地(SFRは含まない)
RAM_START_ADR = 00400
# ROMの先頭番地
ROM_START_ADR = 0f80000

#
# ツールのインストール先ディレクトリ
#
TOOLDIR = \mtool

#  タスクモニタを使用するか（しない場合は0に、使用する場合は1に）
MON = 0

#  KD3083を使用するか（しない場合は0に、使用する場合は1にする）
USE_KD3083 = 1

# LB308を使うかどうか（使用しない場合はコメントアウトする）
#USE_LB308 = 1

#
#  ソースファイルのディレクトリの定義
#
SRCDIR = @(SRCDIR)

#
#  カーネルライブラリ（libkernel.lib）のディレクトリ名
#  （カーネルライブラリも make 対象にする時は，空に定義する）
#   configure でMakefile生成時に -L オプション指定でも設定できる
#
KERNEL_LIB = @(KERNEL_LIB)

#
#  共通コンパイルオプションの定義
#
COPTS = -dir . -silent -g	# -O2		## -O2はエントリー版では未サポート
ifndef USE_LB308
	CDEFS = -DNEED_API
endif
INCLUDES = -I. -I$(SRCDIR)\include -I$(SRCDIR)\config\$(CPU)-$(TOOL) \
			-I$(SRCDIR)\config\$(CPU)-$(TOOL)\$(SYS)
CFLAGS = $(COPTS) $(CDEFS) $(INCLUDES)
LDFLAGS = -. -MSL -M82 -G
LIBS = nc382lib
ASMFLAGS = -O. -. -I. -M82

#
#  アプリケーションプログラムに関する定義
#
UNAME = @(UNAME)
UTASK_CFG = $(UNAME).cfg

UTASK_DIR = $(SRCDIR)\library
UTASK_ASMOBJS =
UTASK_COBJS = $(UNAME).r30 @(UTASK)
UTASK_CFLAGS =
UTASK_LIBS =

#
#  システムサービスに関する定義
#
STASK_DIR = $(SRCDIR)\systask:$(SRCDIR)\library
STASK_ASMOBJS =
STASK_COBJS = timer.r30 serial.r30 logtask.r30 \
	      log_output.r30 vasyslog.r30 t_perror.r30 strerror.r30 sfruart.r30
STASK_CFLAGS = -I$(SRCDIR)\systask
STASK_LIBS =

#
#  カーネルに関する定義
#
#  KERNEL_ASMOBJS: カーネルライブラリに含める，ソースがアセンブリ言語の
#		   オブジェクトファイル．
#  KERNEL_COBJS: カーネルのライブラリに含める，ソースがC言語で，ソース
#		 ファイルと1対1に対応するオブジェクトファイル．
#  KERNEL_LCSRCS: カーネルのライブラリに含めるC言語のソースファイルで，
#		  1つのソースファイルから複数のオブジェクトファイルを生
#		  成するもの（Makefile.kernel で定義）．
#  KERNEL_LCOBJS: 上のソースファイルから生成されるオブジェクトファイル
#		  （Makefile.kernel で定義）．
#  KERNEL_AUX_COBJS: ロードモジュールに含めないが，カーネルのソースファ
#		     イルと同じオプションを適用してコンパイルすべきファ
#		     イル．
#
KERNEL = $(SRCDIR)\kernel
KERNEL_DIR = $(KERNEL):$(SRCDIR)\config\$(CPU)-$(TOOL):$(SRCDIR)\config\$(CPU)-$(TOOL)\$(SYS)

KERNEL_ASMOBJS = cpu_support.r30
KERNEL_COBJS = startup.r30 banner.r30 cpu_config.r30 sys_config.r30
KERNEL_AUX_COBJS = kernel_chk.r30

KERNEL_ASMFLAGS = -DRAMEND=$(RAMEND)h:MON=$(MON):USE_KD3083=$(USE_KD3083)
KERNEL_CFLAGS = -I$(KERNEL)

#
#  オブジェクトファイル名の定義
#
OBJNAME = jsp
OBJFILE = $(OBJNAME).x30

#
#  ターゲットファイル（複数を同時に選択してはならない）
#
#all: $(OBJFILE)
all: $(OBJNAME).mot

#
#  カーネルのコンフィギュレーションファイルの生成
#
kernel_cfg.c kernel_id.h kernel_chk.c: $(UTASK_CFG)
	$(CPP)   $(INCLUDES) $(CDEFS) $(UTASK_CFG) > tmpfile1
	$(SRCDIR)\cfg\cfg -s tmpfile1 -c -obj -cpu $(CPU) -system $(SYS)
	@-del tmpfile1

##### 以下は編集しないこと #####

#
# スタートアップモジュール関連
#
START_OBJS = start.r30

#  依存関係作成ルール(何もしない)
$(START_OBJS:.r30=.d): %.d: %.a30

# スタートアップモジュールのコンパイルルール
$(START_OBJS): %.r30: %.a30 m16cvec.inc
	$(AS) $(ASMFLAGS) -DRAMEND=$(RAMEND)h:MON=$(MON) $(<D)\$(<F)

#
#	ベクタテーブル定義ファイルの生成
#
m16cvec.inc: kernel_cfg.c
	$(CC) -E $(INCLUDES) $(<D)\$(<F) > kernel_cfg.i
	$(SRCDIR)\utils\m16c-renesas\m16cvec.exe -M0 -F0ffffdch

#
#  カーネルライブラリに関連する定義
#

# 既存のカーネルライブラリファイルがある場合
ifdef KERNEL_LIB
    MAKE_KERNEL =
    LIBKERNEL = $(KERNEL_LIB)\libkernel.lib
else
ifdef USE_LB308	# 既存のカーネルライブラリがなく、ライブラリを作る場合
    MAKE_KERNEL = libkernel.lib
    LIBKERNEL = $(MAKE_KERNEL)
else	# 既存のカーネルライブラリがなく、ライブラリを作らない場合
    MAKE_KERNEL = $(KERNEL_LIB_OBJS)
    LIBKERNEL =
endif
endif

#
#  カーネルのファイル構成の定義
#
include $(SRCDIR)\config\$(CPU)-$(TOOL)\$(SYS)\Makefile.kernel

#
#  ソースファイルのあるディレクトリに関する定義
#
vpath %.c $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR)
vpath %.a30 $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR)
vpath %.inc $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR)

#
#  コンパイルのための変数の定義
#

#
# カーネルライブラリに含めるオブジェクトファイル
#
KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS) $(KERNEL_LCOBJS)

# オブジェクトファイルの定義
STASK_OBJS = $(STASK_ASMOBJS) $(STASK_COBJS)
UTASK_OBJS = $(UTASK_ASMOBJS) $(UTASK_COBJS)
TASK_OBJS = $(UTASK_OBJS) $(STASK_OBJS) kernel_cfg.r30

# リンクする（ライブラリでない）オブジェクトファイル
ALL_OBJS = $(START_OBJS) $(TASK_OBJS) $(END_OBJS)
# 使用するライブラリ
ALL_LIBS := $(UTASK_LIBS) $(STASK_LIBS) $(LIBKERNEL) $(LIBS)

#
#  カーネルライブラリファイルの生成
#
libkernel.lib: $(KERNEL_LIB_OBJS)
	@-del libkernel.lib
	$(AR) -. -c $@ $(KERNEL_LIB_OBJS)

#
#  全体のリンク
#
$(OBJFILE): Makefile.depend $(ALL_OBJS) $(MAKE_KERNEL) # $(OBJNAME).chk
	@echo $(LDFLAGS) > $(OBJNAME).cmd
	@echo -O $(OBJFILE) >> $(OBJNAME).cmd
	@echo -NOSTOP >> $(OBJNAME).cmd
	@echo -ORDER data_NE=$(RAM_START_ADR) >> $(OBJNAME).cmd
	@echo -ORDER data_NO >> $(OBJNAME).cmd
	@echo -ORDER bss_NE >> $(OBJNAME).cmd
	@echo -ORDER bss_NO >> $(OBJNAME).cmd
	@echo -ORDER program=$(ROM_START_ADR) >> $(OBJNAME).cmd
	@echo -ORDER rom_FE >> $(OBJNAME).cmd
	@echo -ORDER rom_FO >> $(OBJNAME).cmd
	@echo -ORDER data_NEI >> $(OBJNAME).cmd
	@echo -ORDER data_NOI >> $(OBJNAME).cmd
	@echo -ORDER vvector >> $(OBJNAME).cmd
	@echo -ORDER fvector >> $(OBJNAME).cmd
	@echo $(ALL_OBJS) >> $(OBJNAME).cmd
ifndef USE_LB308
	@echo $(wordlist 1,5,$(KERNEL_LIB_OBJS)) >> $(OBJNAME).cmd
	@echo $(wordlist 6,10,$(KERNEL_LIB_OBJS)) >> $(OBJNAME).cmd
	@echo $(wordlist 11,15,$(KERNEL_LIB_OBJS)) >> $(OBJNAME).cmd
	@echo $(wordlist 16,20,$(KERNEL_LIB_OBJS)) >> $(OBJNAME).cmd
	@echo $(wordlist 21,25,$(KERNEL_LIB_OBJS)) >> $(OBJNAME).cmd
endif
	@echo -L $(subst $(space),$(comma),$(strip $(ALL_LIBS))) >> $(OBJNAME).cmd
	$(LD) @$(OBJNAME).cmd

#
#  Sレコードファイルの生成
#
$(OBJNAME).mot: $(OBJFILE)
	$(OBJCOPY) -. -ID#00000000000000 $<

#
#  コンパイル結果の消去
#
clean:
	@-del \#* *~ *.r30 tmpfile?
	@-del $(MAKE_KERNEL) $(OBJNAME)
	@-del $(OBJNAME).syms $(OBJNAME).mot $(OBJNAME).chk
	@-del $(OBJNAME).exe $(OBJNAME).bin $(OBJNAME).out
	@-del $(OBJNAME).map $(OBJFILE)  $(OBJNAME).id $(OBJNAME).cmd
	@-del kernel_cfg.c kernel_chk.c kernel_chk.a30 kernel_id.h kernel_obj.dat
	@-del m16cvec.inc
cleankernel:
	@-del $(KERNEL_LIB_OBJS)
	@-del $(KERNEL_LCOBJS:.r30=.a30)
	@-del m16cvec.inc

cleandep:
	@-del Makefile.depend

realclean: cleandep clean

#
#  kernel_cfg.c のコンパイルルールと依存関係作成ルールの定義
#
#  kernel_cfg.c は，アプリケーションプログラム用，システムサービス用，
#  カーネル用のすべてのオプションを付けてコンパイルする．
#
KERNEL_CFG_CFLAGS = $(UTASK_CFLAGS) $(STASK_CFLAGS) $(KERNEL_CFLAGS)

kernel_cfg.r30: kernel_cfg.c
	$(CC) -c $(CFLAGS) $(KERNEL_CFG_CFLAGS) $(<D)\$(<F)

kernel_cfg.a30: kernel_cfg.c
	$(CC) -S $(CFLAGS) $(KERNEL_CFG_CFLAGS) $(<D)\$(<F)

kernel_cfg.d: kernel_cfg.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) \
		-O "$(INCLUDES) -I$(SRCDIR)\kernel -I$(SRCDIR)\systask" \
		$(<D)\$(<F) >> Makefile.depend

#
#  特別な依存関係の定義
#
banner.r30: $(filter-out banner.r30,$(KERNEL_LIB_OBJS))

#
#  特殊な依存関係作成ルールの定義
#
kernel_id.d: $(UTASK_CFG)
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) \
		-T "kernel_cfg.c kernel_id.h kernel_chk.c" \
		-O "$(INCLUDES)" $(<D)\$(<F) >> Makefile.depend

kernel_chk.d: kernel_chk.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -s -C $(CPP) \
		-O "$(INCLUDES) -I$(KERNEL)" $(<D)\$(<F) >> Makefile.depend

#
#  依存関係ファイルの生成
#
gendepend:
	@echo "Generating Makefile.depend."

ifdef KERNEL_LIB
depend: cleandep kernel_cfg.c gendepend kernel_id.d \
		kernel_chk.d $(ALL_OBJS:.r30=.d)
else
depend: cleandep kernel_cfg.c gendepend kernel_id.d \
		$(KERNEL_AUX_COBJS:.r30=.d) $(KERNEL_ASMOBJS:.r30=.d) \
		$(KERNEL_COBJS:.r30=.d) $(KERNEL_LCSRCS:.c=.d) $(ALL_OBJS:.r30=.d)
endif

#
#  依存関係ファイルをインクルード
#
-include Makefile.depend

#
#  開発ツールのコマンド名の定義
#
CC = $(TOOLDIR)\bin\nc308
AS = $(TOOLDIR)\bin\as308
AR = $(TOOLDIR)\bin\lb308
LD = $(TOOLDIR)\bin\ln308
CPP = $(TOOLDIR)\lib308\cpp308
OBJCOPY = $(TOOLDIR)\bin\lmc308

PERL = @(PERL)

#
#  コンパイルルールの定義
#
KERNEL_ALL_COBJS = $(KERNEL_COBJS) $(KERNEL_AUX_COBJS)

$(KERNEL_ALL_COBJS): %.r30: %.c
	$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $(<D)\$(<F)

$(KERNEL_ALL_COBJS:.r30=.a30): %.a30: %.c
	$(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $(<D)\$(<F)

ifdef USE_LB308

$(KERNEL_LCOBJS): %.r30: %.a30
	$(CC) -D__$(*F) -o $@ -c $(CFLAGS) $(KERNEL_CFLAGS) $(<D)\$(<F)

$(KERNEL_LCOBJS:.r30=.a30): %.a30:
	$(CC) -D__$(*F) -o $@ -S $(CFLAGS) $(KERNEL_CFLAGS) $(<D)\$(<F)
	ren $(<F:.c=.a30) $@

else

$(KERNEL_LCOBJS): %.r30: %.c
	$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $(<D)\$(<F)

$(KERNEL_LCOBJS:.r30=.a30): %.c
	$(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $(<D)\$(<F)

endif

$(KERNEL_ASMOBJS): %.r30: %.a30
	$(AS) $(ASMFLAGS) $(KERNEL_ASMFLAGS) $(<D)\$(<F)

$(STASK_COBJS): %.r30: %.c
	$(CC) -c $(CFLAGS) $(STASK_CFLAGS) $(<D)\$(<F)

$(STASK_COBJS:.r30=.a30): %.a30: %.c
	$(CC) -S $(CFLAGS) $(STASK_CFLAGS) $(<D)\$(<F)

$(STASK_ASMOBJS): %.r30: %.a30
	$(AS) $(ASMFLAGS) $(STASK_ASMFLAGS) $(<D)\$(<F)

$(UTASK_COBJS): %.r30: %.c
	$(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $(<D)\$(<F)

$(UTASK_COBJS:.r30=.a30): %.a30: %.c
	$(CC) -S $(CFLAGS) $(UTASK_CFLAGS) $(<D)\$(<F)

$(UTASK_ASMOBJS): %.r30: %.a30
	$(AS) $(ASMFLAGS) $(UTASK_ASMFLAGS) $(<D)\$(<F)

#
#  依存関係作成ルールの定義
#
# アセンブリ言語ファイルが依存するファイルは
# それぞれのコンパイルルールで明示することにし、ここでは何もしない.
#
$(KERNEL_COBJS:.r30=.d): %.d: %.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) \
		-O "$(INCLUDES) -I$(KERNEL)" $(<D)\$(<F) >> Makefile.depend

ifdef USE_LB308

$(KERNEL_LCSRCS:.c=.d): %.d: %.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) -T "$($*)" \
		-O "$(foreach sym,$($*),-D__$(sym:.r30=)) \
		$(INCLUDES) -I$(KERNEL)" $(<D)\$(<F) >> Makefile.depend

$(KERNEL_LCOBJS:.r30=.d): %.d:
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) -T $*.r30 \
		-O "-D__$(*F) $(INCLUDES) -I$(KERNEL)" $(<D)\$(<F) >> Makefile.depend

else

$(KERNEL_LCOBJS:.r30=.d): %.d: %.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) \
		-O "$(INCLUDES) -I$(KERNEL)" $(<D)\$(<F) >> Makefile.depend

endif


$(KERNEL_ASMOBJS:.r30=.d): %.d: %.a30


$(STASK_COBJS:.r30=.d): %.d: %.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) \
		-O "$(INCLUDES) -I$(SRCDIR)\systask" $(<D)\$(<F) >> Makefile.depend

$(STASK_ASMOBJS:.r30=.d): %.d: %.a30


$(UTASK_COBJS:.r30=.d): %.d: %.c
	@$(PERL) $(SRCDIR)\utils\m16c-renesas\makedep.m16c -C $(CPP) \
		-O "$(INCLUDES)" $(<D)\$(<F) >> Makefile.depend

$(UTASK_ASMOBJS:.r30=.d): %.d: %.a30


#
#  デフォルトコンパイルルールを上書き
#
%.r30: %.c
	@echo "*** Default compile rules should not be used."
	$(CC) -c $(CFLAGS) $(<D)\$(<F)

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

%.r30: %.a30
	@echo "*** Default compile rules should not be used."
	$(AS) $(ASMFLAGS) $(<D)\$(<F)

#
# 空白で区切られた文字列の空白をカンマに変えるための定義
#
comma= ,
empty=
space= $(empty) $(empty)

