bambooflow Note

Makefile

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

SystemCコンパイルのためのGNU-Makefile書き方メモ


書き方なんてひとそれぞれですが、以外とMakefile書くのも面倒なのでメモ書きします.
コンパイルするときは、ここからコピペで使用すれば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.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メモ

とりあえず、コンパイルしたい場合は、下記のMakefileで十分かと。

make all を実行すると、$(wildcard *.cpp)によりmakeを実行したディレクトリ上の.cppファイルを探してコンパイルします。
コンパイルが完了すると、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でしょうか。
gcov xxx.gcda

以上

タグ:

SystemC Makefile
添付ファイル
記事メニュー
目安箱バナー