SystemCコンパイルのためのGNU-Makefile書き方メモ
書き方なんてひとそれぞれですが、以外とMakefile書くのも面倒なのでメモ書きします.
コンパイルするときは、ここからコピペで使用すればOK.
コンパイルするときは、ここからコピペで使用すればOK.
単純なコンパイル方法
test.cpp1つをコンパイルする方法。
$ g++ -I/usr/local/systemc-2.2/include -c test.cpp $ g++ -I/usr/local/systemc-2.2/lib-linux -lsystemc -lm -o run.x test.o
シンプルなMakefile
メイクファイルは以下のように用意する。
CC = g++ SYSTEMC = /usr/local/systemc-2.1 INCDIR = -I. -I$(SYSTEMC)/include LIBDIR = -L. -L$(SYSTEMC)/lib-linux LIBS = -lsystemc -lm CFLAGS = -O2 -Wall TARGET = run.x SRCS = adder.cpp tb.cpp main.cpp OBJS = $(SRCS:.cpp=.o) all: $(TARGET) $(TARGET): $(OBJS) $(CC) -o $@ $(LIBDIR) $(LIBS) $(OBJS) .cpp.o: $(CC) $(CFLAGS) $(INCDIR) -c $< clean: @rm -f *.o $(TARGET)
環境等で変更が必要なのは、"SYSTEMC"のライブラリの場所指定と、"SRCS"のコンパイルするファイル指定の箇所。
Makefile.defsを利用する
メイクファイルからMakefile.defsをインクルードして使う方法がある。
Makefile.defは展開したsystemc-2.2.0.tgzの以下にある。
systemc-2.2.0/examples/sysc/Makefile.defs
Makefile.defは展開したsystemc-2.2.0.tgzの以下にある。
systemc-2.2.0/examples/sysc/Makefile.defs
これを利用すればメイクファイルの共通した記述を省略できる。
Makefile.defs
Makefile.defsは以下のようになっている。
- Makefile.defs
SYSTEMC = /usr/local/systemc-2.2 INCDIR = -I. -I$(SYSTEMC)/include LIBDIR = -L. -L$(SYSTEMC)/lib-$(TARGET_ARCH) LIBS = -lsystemc -lm $(EXTRA_LIBS) EXE = $(MODULE).x .SUFFIXES: .cc .cpp .o .x $(EXE): $(OBJS) $(SYSTEMC)/lib-$(TARGET_ARCH)/libsystemc.a $(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(OBJS) $(LIBS) 2>&1 | c++filt .cpp.o: $(CC) $(CFLAGS) $(INCDIR) -c $< .cc.o: $(CC) $(CFLAGS) $(INCDIR) -c $< clean:: rm -f $(OBJS) *~ $(EXE) core ultraclean: clean rm -f Makefile.deps Makefile.deps: # $(CC) $(CFLAGS) $(INCDIR) -M $(SRCS) >> Makefile.deps #include Makefile.deps
環境等で変更が必要なのは、"SYSTEMC"のライブラリの場所指定。
Makefile
追加するメイクファイルは以下のようにする。
- Makefile(例)
CC = g++ CFLAGS = -Wall -g EXTRA_LIBS = -O2 TARGET_ARCH = [[linux]] # target name MODULE = run SRCS = test.cpp OBJS = $(SRCS:.cc=.o) include ../Makefile.defs
作業ディレクトリ構成
作業ディレクトリは以下のようになる。
Sysc/
|-- Makefile.defs # 共通して使う
|-- sample01
| |-- Makefile # sample01用に作成
| |-- test.cpp
|-- sample02
| |-- Makefile # sample02用に作成
| |-- test.cpp
`-- sample03
・・・
|-- Makefile.defs # 共通して使う
|-- sample01
| |-- Makefile # sample01用に作成
| |-- test.cpp
|-- sample02
| |-- Makefile # sample02用に作成
| |-- test.cpp
`-- sample03
・・・
お気に入りMakefileメモ
とりあえず、コンパイルしたい場合は、下記のMakefileで十分かと。
make all を実行すると、$(wildcard *.cpp)によりmakeを実行したディレクトリ上の.cppファイルを探してコンパイルします。
コンパイルが完了すると、TARGET名であるrun.x実行ファイルができあがります。
オブジェクトファイル(.o)はobjsディレクトリに生成されるようにしました。
そのほうがすっきりするので。
コンパイルが完了すると、TARGET名であるrun.x実行ファイルができあがります。
オブジェクトファイル(.o)はobjsディレクトリに生成されるようにしました。
そのほうがすっきりするので。
######################################################################
# SystemC Makefile
######################################################################
CXX := g++
TARGET := run.x
OBJDIR := objs
# coverage option
#GCOV_OPT := -coverage
# Source File
SRCS := $(wildcard *.cpp)
OBJS := $(SRCS:.cpp=.o)
OBJS := $(addprefix $(OBJDIR)/,$(OBJS))
######################################################################
# SystemC setting
SYSTEMC := /usr/local/systemc-2.2.0
SYSC_INC := -I. -I$(SYSTEMC)/include
SYSC_LIB := -L. -L$(SYSTEMC)/lib-linux -lsystemc
######################################################################
# Compile option setting
CXXFLAGS := -O2 -Wall
CXXFLAGS += $(GCOV_OPT)
CXXFLAGS += $(SYSC_INC)
CXXLIBS := -lm
CXXLIBS += $(SYSC_LIB)
######################################################################
# Compile setting
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(GCOV_OPT) -o $@ $^ $(CXXLIBS)
$(OBJDIR)/%.o: %.cpp
@[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
$(CXX) -c $(CXXFLAGS) -o $@ $<
clean:
rm -f *~ $(OBJDIR)/*.o $(TARGET)
昔は、.cpp.o:を使うようでしたが、最近では%.o:%.cppを使うみたいです。
あと、カバレッジのオプションを付けてみました.(-coverage)
実行する際は、最適化オプション(-O)ははずしたほうがよいです。
古いコンパイラだとだと、-fprofile-arcs -ftest-coverageでしょうか。
実行する際は、最適化オプション(-O)ははずしたほうがよいです。
古いコンパイラだとだと、-fprofile-arcs -ftest-coverageでしょうか。
gcov xxx.gcda
以上
添付ファイル