2019年1月19日土曜日

TOPPERS cfg の 64 bit ビルドに挑戦(多分その1になる)

とりあえず、 atk2-sc1 のバイナリ作成に成功する cfg バイナリの作成に成功したので作業記録を残す。

環境

  • OS: Windows 10 Pro
  • 使用する docker image: kanetugu2015/athrill_asp3:ver4.0

※ cfg のビルド自体は ubuntu イメージでもできるはず。あとで確認しなきゃ...。

必要なファイルのダウンロードと展開

TOPPERSプロジェクトの cfg ダウンロードページ から、 1.9.6 をダウンロードして展開する。

文字コード、改行コード変換

テキストファイルが EUC, CRLF となっているので、 UTF-8, LF に変換する。

find ./ -type d -name ".git" -prune -or -type f -print0 | xargs -0 nkf -w -Lu --overwrite

ビルド環境を作成

docker を使ってビルド環境を作っていく。

docker run -it --rm -v "$(pwd):/cfg" kanetugu2015/athrill_asp3:ver4.0

docker コンテナ内の作業。

apt-get update
apt-get -y upgrade
apt-get install -y g++ make libboost-dev libboost-regex-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libxerces-c-dev

インストールされるライブラリのバージョンが cfg リリース時点のものと違いますね。 とりあえずこのままやっちゃいましょう。

ビルド

cd /cfg
./configure --with-libraries=/usr/lib/x86_64-linux-gnu --with-xml
make

はい。

g++ -O2  -DHAS_CFG_XML=1  -I/usr/include -I..  -c -o builtin_function.o builtin_function.cpp
In file included from ../toppers/macro_processor.hpp:55,
                 from builtin_function.cpp:46:
../toppers/text.hpp: In member function 'void toppers::basic_text<Container, CharT, Traits, Allocator>::init(const toppers::basic_text<Container, CharT, Traits, Allocator>::const_iterator&, const toppers::basic_te
xt<Container, CharT, Traits, Allocator>::const_iterator&)':
../toppers/text.hpp:731:25: error: 'next' is not a member of 'boost'
       std::copy( boost::next( first ).get_row(), last.get_row(), std::back_inserter( container_ ) );
                         ^~~~
../toppers/text.hpp:731:25: note: suggested alternative: 'get'
       std::copy( boost::next( first ).get_row(), last.get_row(), std::back_inserter( container_ ) );
                         ^~~~
                         get
...(略)

boost::next は、配置場所が変わったのでマイグレーションが必要らしいですね。

置換していきましょう。

boost::next 対応

使っているファイルの確認。

$ find ./ -type f -name "*.cpp" -or -name "*.hpp" -print0 | xargs -0 grep "boost/utility.hpp"
./cfg/cfg.hpp:#include <boost/utility.hpp>
./toppers/cpp.hpp:#include <boost/utility.hpp>
./toppers/csv.hpp:#include <boost/utility.hpp>
./toppers/text.hpp:#include <boost/utility.hpp>

この 4 つだけみたいですね、それじゃぁ置換します。

$ find ./ -type f -name "*.cpp" -or -name "*.hpp" -print0 | xargs -0 sed -i -e 's/boost\/utility.hpp/boost\/next_prior.hpp/'

ビルド再挑戦

make

はい。ワーニング出てますが、ビルド自体は成功しているっぽいので動作確認しましょうか。

動作確認

$ cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
$ cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
$ make
...(略)
{ "EXEC kernel.tf"(),  }
{ "ASSOCIATE TASK"(),  }
{ "ASSOCIATE ISR"(),  }
{ "ASSOCIATE ALARM"(),  }
{ "ASSOCIATE SCHTBL"(),  }
{ "ISR CHECK"(),  }
{ "RESOURCE CHECK"(),  }
{ "TASK CHECK"(),  }
{ "EVENT CHECK"(),  }

{ "COUNTER CHECK"(),  }
{ "ALARM CHECK"(),  }
{ "SCHEDULETABLE CHECK"(),  }

{ "OUTPUT FILES"(),  }

Makefile:340: recipe for target 'Os_Lcfg.timestamp' failed
make: *** [Os_Lcfg.timestamp] Segmentation fault

oh...。セグフォか...。ワーニング消していかなきゃダメですかね?

とりあえず、最適化外してみる。

最適化を外す

sed -i -e 's/OPTIMIZE = -O2/OPTIMIZE = -O0/' Makefile

最適化なしでのビルド

cd /cfg
make clean all

最適化なしでの実行

$ cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
$ cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
$ make clean all
...(略)
v850-elf-objcopy -O srec -S atk2-sc1 atk2-sc1.srec
../cfg/cfg/cfg --pass 3 --kernel atk2 -I. -I../include -I../arch -I..  -I../target/v850esfk3_gcc -I..//arc
h/v850esfk3_gcc -I..//arch/gcc \
                        --rom-image atk2-sc1.srec --symbol-table atk2-sc1.syms \
                        -T ../target/v850esfk3_gcc/target_check.tf --api-table ../kernel/kernel.csv --cfg1
-def-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_g
cc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.a
rxml
v850-elf-objdump -d atk2-sc1 > atk2-sc1.dump

ふむ、成功しました。

手順は省略するけど athrill での実行もできました。

とりあえず今回はここまで。

最適化かけたときだけ落ちるって...、これどういうアプローチしていこうかしら?

0 件のコメント:

コメントを投稿