僕のISSを、Travis-CIを使ってリグレッションをしてみることにした。基本的には、既にコンパイルしたパタンを一緒にアップロードしておき、これを流すことでリグレッションとする。 リグレッションには、CTestを使い、既にriscv-toolsより提供されているriscv-testsのパタンを流すことにした。
CMakeLists.txtは既に作成しており、500種類程度のパタンがCTestのパタンとして登録されている。
# CTest enable_testing() add_test (NAME rv32mi-p-csr COMMAND ./isa_test.sh 32 ./isa-test-caf75e5/rv32mi-p-csr) add_test (NAME rv32mi-p-illegal COMMAND ./isa_test.sh 32 ./isa-test-caf75e5/rv32mi-p-illegal) add_test (NAME rv32mi-p-ma_addr COMMAND ./isa_test.sh 32 ./isa-test-caf75e5/rv32mi-p-ma_addr) add_test (NAME rv32mi-p-ma_fetch COMMAND ./isa_test.sh 32 ./isa-test-caf75e5/rv32mi-p-ma_fetch) ...
YAMLファイルを記述する
YAMLファイルとは、構造化データやオブジェクトを文字列としてシリアライズするためのファイル形式だ、、って何だか良く分からん。
Rubyist Magazine - プログラマーのための YAML 入門 (初級編)
YAML (YAML Ain't Markup Language) とは、構造化されたデータを表現するためのフォーマットです。YAML は次のような用途に向いています。
各種設定ファイル データ保存用 (シリアライゼーション) データ交換用フォーマット ログファイル
そうなんだ。。。背景はさておき、リグレッションをするためのyamlファイルを記述していこう。Travis-CIで有効にするためには、.travis.ymlを記述する。
script: - cd ./vendor/gflags && cmake . && make && cd - - cd ./build_riscv && cmake . && make && cd - - cd ./build_riscv && ctest
このファイルをgit addし、pushすると、その時点でTravis-CIを動作させることができるようになる(もちろんgithubとTravis-CIの事前の連携は必要になるが)。
ツールのバージョンが合わない場合
しかしいきなり詰まる。Travis-CI内で立ち上がる仮想マシンで、容易されるcmakeのバージョンが低すぎるのだ。どうしよう。。。
$ cmake ./build_riscv ctest ./build_riscv CMake Error at CMakeLists.txt:1 (cmake_minimum_required): CMake 3.1 or higher is required. You are running version 2.8.7
このままでは、C++11xを必要とするgccのバージョンも古いことになってしまう。あ、あとISSの実行にはliblua-5.2とbinutilsが必要だな。。。どうすれば良いんだろう。
リグレッションを実行する前に必要なツールをインストールする
これを解決するためには、yamlで before_script というラベルを用意する。
before_script: - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test - sudo apt-get -qq update - sudo apt-get -qq install liblua5.2-dev libbfd-dev g++-4.9 -y - wget --no-check-certificate -qO- http://www.cmake.org/files/v3.4/cmake-3.4.1-Linux-x86_64.tar.gz -O /tmp/cmake-3.4.1-Linux-x86_64.tar.gz - tar -xvf /tmp/cmake-3.4.1-Linux-x86_64.tar.gz - export PATH=$PWD/cmake-3.4.1-Linux-x86_64/bin/:$PATH
ずいぶんと長ったらしいが、まずはUbuntuのリポジトリのアップデート、必要なライブラリのインストール、そして今回は最新のCMakeが必要なためダウンロードと展開(wgetの利用にはno-check-certificateが必要らしい)を行った。 さらにパスを設定することでCMakeの実行パスはインストールしたものに置き換わる。
ついでに、GCCのバージョンも最新にしてしまおう。
- export CXX="g++-4.9" - export CC="gcc-4.9"
まだ設定するべきところがあるらしい(まだ途中)
上記のバージョン問題はこれで解決したが、まだ解決しなければならない問題があるらしい。コンパイル中に失敗するので、これはのちのち追い掛けていこう。