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
以上
添付ファイル
