チラシの裏は意外と白くない

最近忘れっぽくなったので調べたことをチラシの裏に書きます

SystemCのexample

手始めに/usr/local/systemc/2.3.3/examples/の中身を見てみることにする。

まずはmake

とりあえずbuild-unix/というディレクトリ以下でmakeできるようなので、makeしてみた。

$ make
make[1]: ディレクトリ `/home/XXXX/sandbox/systemc/tutorial/examples/sysc/pipe' に入ります
../../build-unix/Makefile.rules:101: *** SystemC library [/usr/local/systemc/2.3.3/lib] not found. Please update Makefile.config.  中止.
make[1]: ディレクトリ `/home/XXXX/sandbox/systemc/tutorial/examples/sysc/pipe' から出ます
make: *** [all] エラー 2

lib-linux64を見てほしいのに、libを見に行ってしまっている。以下の$SYSTEMC_LIB_DIRが環境とあっていない模様。

Makefile.rules:SYSTEMC_LIB_DIR  ?= $(SYSTEMC_HOME)/lib$(ARCH_SUFFIX)

?=は左辺が空(未定義)の時に右辺を代入するという意味らしい。で、$ARCH_SUFFIXが空だと、今のエラーにつながりそう。 READMEによると

   The following variables can be set (or overridden from the environment):

     SYSTEMC_HOME           - path to installation
     TARGET_ARCH            - target architecture
     ARCH_SUFFIX            - library architecture suffix (see INSTALL)

なので、自分で設定してしまってよいのかな。$SYSTEMC_HOMEはインストール時に.bashrcに設定しているので、$TARGET_ARCHと$ARCH_SUFFIXはMakefile.rulesに書いてしまおう。今後もよく使う変数ならその時.bashrcに移動させる。さらにMakefile.rulesの書き方だと$ARCH_SUFFIXは$TARGET_ARCHを参照しているので、$TARGET_ARCHのみ設定してあげた。

## Select the TARGET_ARCH needs to be set
# TARGET_ARCH      ?= linux
TARGET_ARCH       = linux64

## default values for additional setup variables
ifneq (,$(strip $(TARGET_ARCH)))
ARCH_SUFFIX      ?= -$(TARGET_ARCH)
endif
LDFLAG_RPATH     ?= -Wl,-rpath=

で、再度make

$ make
make[1]: ディレクトリ `/home/XXXX/sandbox/systemc/tutorial/examples/sysc/pipe' に入ります

*** pipe:

g++  -g -Wall -pedantic -Wno-long-long -Werror -I. -I.. -I/usr/local/systemc/2.3.3/include  -c stage2.cpp -o stage2.o
In file included from /usr/local/systemc/2.3.3/include/sysc/datatypes/bit/sc_logic.h:68:0,
                 from /usr/local/systemc/2.3.3/include/sysc/kernel/sc_wait_cthread.h:36,
                 from /usr/local/systemc/2.3.3/include/sysc/kernel/sc_module.h:40,
                 from /usr/local/systemc/2.3.3/include/systemc:74,
                 from /usr/local/systemc/2.3.3/include/systemc.h:219,
                 from stage2.cpp:38:
/usr/local/systemc/2.3.3/include/sysc/kernel/sc_macros.h:120:18: エラー: 無名可変引数マクロは C99 で導入されました [-Werror=variadic-macros]
 #define SC_NAMED(...) \
                  ^
/usr/local/systemc/2.3.3/include/sysc/kernel/sc_macros.h:131:36: エラー: 無名可変引数マクロは C99 で導入されました [-Werror=variadic-macros]
 # define SC_NAMED_IMPL_MORE_(inst, ...) \
                                    ^
/usr/local/systemc/2.3.3/include/sysc/kernel/sc_macros.h:135:24: エラー: 無名可変引数マクロは C99 で導入されました [-Werror=variadic-macros]
 #define SC_NAMED_IMPL_(...) \
                        ^
/usr/local/systemc/2.3.3/include/sysc/kernel/sc_macros.h:137:31: エラー: 無名可変引数マクロは C99 で導入されました [-Werror=variadic-macros]
 #define SC_NAMED_IMPL_EXPAND_(...) \
                               ^
/usr/local/systemc/2.3.3/include/sysc/kernel/sc_macros.h:148:35: エラー: 無名可変引数マクロは C99 で導入されました [-Werror=variadic-macros]
   _25,_26,_27,_28,_29,_30,_31, N, ...) N
                                   ^
cc1plus: all warnings being treated as errors
make[1]: *** [stage2.o] エラー 1
make[1]: ディレクトリ `/home/XXXX/sandbox/systemc/tutorial/examples/sysc/pipe' から出ます
make: *** [all] エラー 2

とりあえずライブラリの参照は解決したが、次なるエラー。ひとまずMakefile.ruleを以下のように書き換えて再度makeしたところ今度はコンパイルが通った様子。

CXXFLAGS  += $(CFLAGS) $(SYSTEMC_CXXFLAGS) $(INCDIR) $(SYSTEMC_DEFINES) -std=c++11

なお、これに合わせて、SystemC自体も一部設定を変えて再インストールした

とりあえずsimple_fifoを実行してみた

$ ./simple_fifo.x 

        SystemC 2.3.3-Accellera --- Mar  8 2020 14:00:56
        Copyright (c) 1996-2018 by all Contributors,
        ALL RIGHTS RESERVED


V<9>isit www<1>.a<9>ccellera<1>.o<9>rg and s<1>ee<9> what Sy<1>st<9>emC can <1>do<9> for you<1> today!<1>

なんか余分な文字が含まれている気がするが、何かしらは動いた。次はexampleの中身を詳しく見ていこうと思う。