忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/22 (Fri) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2009/01/19 (Mon) / 編集
こないだ[MacOSX] gccクロスコンパイラ+BrickOSでBrickOSのコンパイルまではできた訳だが、そのあと自作プログラムをコンパイルするのに手間取ったのでメモっておく

なにがダメだったかというと、demoプログラムをコンパイルするのに使うMakefileで自作のプログラムがコンパイルできなかった、、、BrickOSはmake installするとMakefileのテンプレをインストールしてくれる(今回は「/usr/local/share/doc/brickos/examples/」だった、「/usr/share/doc/brickos/examples」なこともあるらしい)のだがこのMakefileをコピペしたものを使ってもサンプルコードすらうまくコンパイルできない
make -C c++ all
make: *** c++: No such file or directory. Stop.
make: *** [all] Error 2
rm helloworld.ds1 helloworld.dc2 helloworld.ds2 helloworld.dc1
Makefileの中身をみてみたら、どうやら「Makefile」から「Makefile.commom」と「Makefile.user」を呼び出しているらしく、しかもBrickOS本体用のコンパイル方法も混ざってるので非常にわかりにくい、、、仕方ないのでこの3つのファイルを統合&整理して自作プログラム用Makefile作ってみた

:[tab]はタブコードで置き換えてください
緑色の字は書き換える必要があります。


##setting for your program##
## if you hope compile helloworld.c , set helloworld.lx
PROGRAMS=linetrack.lx

## set path for brickos & H8/300 compilar
LIBDIR = /usr/local/lib/brickos
INCDIR = /usr/local/include/brickos
KERNEL = $(LIBDIR)/brickOS
TOOLPREFIX=/usr/local/h8300-hms/bin/h8300-hms-
####

all:: $(PROGRAMS)

##set commands
AS=$(TOOLPREFIX)as
AR=$(TOOLPREFIX)ar
LD=$(TOOLPREFIX)ld
NM=$(TOOLPREFIX)nm
OBJCOPY=$(TOOLPREFIX)objcopy
OBJDUMP=$(TOOLPREFIX)objdump
CC=$(TOOLPREFIX)gcc
CXX=$(TOOLPREFIX)g++

MERGEMAP =$(LIBDIR)/merge-map
GENLDS =$(LIBDIR)/genlds
FIXDEPS =$(LIBDIR)/fixdeps
MAKELX =$(LIBDIR)/makelx

##Create C&C++ Flags
COPT =-O2 -fno-builtin -fomit-frame-pointer
CWARN =-Wall
CINC =-I$(INCDIR) -I$(INCDIR)/lnp -I.

CFLAGS=$(COPT) $(CWARN) $(CINC) $(CDEFINES)
CXXFLAGS=-DCXX -fno-rtti -fno-exceptions $(CFLAGS)

# User application libraries. Comment out if linking
# them statically to kernel in Makefile.kernel.
LIBS = -lc -lmint -lfloat -lc++

# Linker command files dynamic executables.
DYNAMIC_LDS = $(KERNEL).lds
DLDFLAGS = -T $(DYNAMIC_LDS) -relax -L$(LIBDIR)

# Base addresses to determine relocation info.
BASE1 = 0xb000
BASE2 = 0xb210

# Add config.h to include path
CINC += -I$(INCDIR)

# How to build executables dynamically linked to the kernel
# Set DYNAMIC_TEXT, DOBJECTS, DYNAMIC_LDS appropriately.
%.dcoff: %.o $(DOBJECTS) $(DYNAMIC_LDS)
[tab]$(LD) $(DLDFLAGS) $*.o $(DOBJECTS) $(LIBS) -o $@ -Ttext $(BASE1) --oformat coff-h8300

# How to make barebones dymanic executable map files
%.dmap: %.dcoff
[tab]$(NM) $< | sort > $@

# How to disassemble coff kernel
%.dis: %.dcoff
[tab]$(OBJDUMP) $(ODFLAGS) $*.dcoff > $@

# How to merge map files with symbols
%.dis2: %.dmap %.dis
[tab]$(MERGEMAP) $*.dmap $*.dis > $@

# How to make coff files of dynamic executables (twice, for makelx)
%.dc1: %.o $(DOBJECTS) $(DYNAMIC_LDS)
[tab]$(LD) $(DLDFLAGS) $*.o $(DOBJECTS) $(LIBS) -o $@ --oformat coff-h8300 -Ttext $(BASE1)

%.dc2: %.o $(DOBJECTS) $(DYNAMIC_LDS)
[tab]$(LD) $(DLDFLAGS) $*.o $(DOBJECTS) $(LIBS) -o $@ --oformat coff-h8300 -Ttext $(BASE2)

# How to make srec files from coff files (twice, for makelx) %.ds2: %.dc2
[tab]$(OBJCOPY) -I coff-h8300 -O symbolsrec $< $@

%.ds1: %.dc1
[tab]$(OBJCOPY) -I coff-h8300 -O symbolsrec $< $@

%.lx: %.ds1 %.ds2
[tab]$(MAKELX) $*.ds1 $*.ds2 $@


### generic rules
# how to assemble
%.o: %.s
[tab]$(AS) $< -o $@

# how to compile C source
%.o: %.c
[tab]$(CC) $(CFLAGS) -c $< -o $@

# how to compile C kernel sources
%.o: $(BRICKOS_ROOT)/kernel/%.c
[tab]$(CC) $(CFLAGS) -c $< -o $@

# how to generate an assembly listing of a kernel source
%.s: $(BRICKOS_ROOT)/kernel/%.c
[tab]$(CC) $(CFLAGS) -c $< -S

# how to compile C++ source
%.o: %.cpp
[tab]$(CXX) $(CXXFLAGS) -c $< -o $@
%.o: %.C
[tab]$(CXX) $(CXXFLAGS) -c $< -o $@

このMakefileを自作のプログラム(hello.c)と同じ階層においてmakeコマンドを実行するとbrickos用のプログラム(hello.lx)が生成されます、注意点としては3つ
  1. 「PROGRAMS」で指定するのはコンパイルしたいソースファイル名(---.c)ではなく生成したいプログラム名(---.lx)
  2. 上と関連して、プログラム名とソースファイル名は同じでなくてはいけない(たとえばhello.lxというプログラムを作りたいならソースファイル名はhello.cにする)
  3. 「LIBDIR」「INCDIR」「KERNEL」「TOOLPREFIX」は環境によって書き換える必要があるかも

見た感じ、アセンブリ言語(.s)とC言語(.c)とC++言語(.cpp or .C)がコンパイルできる模様、ためしてないけどね

拍手[0回]

PR
忍者ブログ [PR]