nuttxのシミュレータをGuix上で動かす
はじめに
nuttxのシミュレータを
Guix上で動かすまでの手順を記載します。
環境の準備
Ubuntuとか利用している場合はドキュメントを見れば何とかなるかと思います。
Guixで環境準備をしようとするとInstallingあたりで躓くかと思います。(私は躓きました)
Installingの記載に以下のように必要なパッケージのインストールを行っている箇所があります。
$ sudo apt install
bison flex gettext texinfo libncurses5-dev libncursesw5-dev
gperf automake libtool pkg-config build-essential gperf genromfs
libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev
libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
$ apt install kconfig-frontends
Guixの場合、パッケージのインストールはguix install [パッケージ名]
で
行うのですが、genromfs
とkconfig-frontends
は無いので自前でビルドする必要があります。
kconfig-frontends, genromfsのインストール
インストールの大まかな流れは以下です。
- https://bitbucket.org/nuttx/tools/src/master/ からコード取得
- kconfig-frontendsのインストール
- kconfig-frontendsディレクトリをkconfig-frontends.tar.gzで圧縮
- パッケージ
kconfig-frontends.scm
の作成 -
guix package -f kconfig-frontends.scm
でインストール
- genromfsのインストール
-
https://bitbucket.org/nuttx/tools/src/master/ から取得したコードの中の
genromfs-0.5.2.tar.gz
を展開しMakefile
の修正 - 展開して出来た
genromfs-0.5.2
ディレクトリをgenromfs-0.5.2.tar.gz
で圧縮 - パッケージ
genromfs.scm
の作成 -
guix package -f genromfs.scm
でインストール
-
https://bitbucket.org/nuttx/tools/src/master/ から取得したコードの中の
となります。以下に詳細を記載します。
kconfig-frontendsのインストール
kconfig-frontendsディレクトリを圧縮します。
$ tar -zcvf kconfig-frontends.tar.gz kconfig-frontends
圧縮したkconfig-frontends.tar.gz
を適当なパスに置きます。
ここでは/home/yutaka/temp/nuttx/temp/
に置いたものとします。
次に同じパスにkconfig-frontends.scm
を作成し、中身は以下のようにします。
(use-modules
(guix packages)
(guix download)
(guix utils)
(guix git-download)
(guix build-system gnu)
(gnu packages flex)
(gnu packages bison)
(gnu packages gperf)
(gnu packages ncurses)
(guix licenses))
(package
(name "kconfig-frontend")
(version "0.01")
(source (origin
(method url-fetch)
(uri "file:///home/yutaka/temp/nuttx/temp/kconfig-frontends.tar.gz")
(sha256
(base32
"0bnci0jgncasr7d7lx8m52nbz49scb7lhr5gf5xddrrz9ywfnqsz"))
))
(build-system gnu-build-system)
(native-inputs
`(("flex" ,flex)
("bison" ,bison)
("gperf" ,gperf)
("ncurses" ,ncurses)
))
(arguments
`(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")))
#:configure-flags '("--enable-mconf" "--disable-nconf" "--disable-gconf" "--disable-qconf")
#:phases (modify-phases %standard-phases
(delete 'check))))
(synopsis "kconfig frontends")
(description
"sample")
(home-page "https://github.com/SaitoYutaka/guix-hello-package")
(license gpl3+))
重要なのは以下。
ここで、圧縮したファイルを指定。
(source (origin
(method url-fetch)
(uri "file:///home/yutaka/temp/nuttx/temp/kconfig-frontends.tar.gz")
Build phaseの修正
(arguments
`(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")))
#:configure-flags '("--enable-mconf" "--disable-nconf" "--disable-gconf" "--disable-qconf")
#:phases (modify-phases %standard-phases
(delete 'check))))
kconfig-frontendsのビルドに必要なパッケージを指定します。
native-inputs
についてのドキュメントの記載はこちら
;; 省略
(gnu packages flex)
(gnu packages bison)
(gnu packages gperf)
(gnu packages ncurses)
;; 省略
(native-inputs
`(("flex" ,flex)
("bison" ,bison)
("gperf" ,gperf)
("ncurses" ,ncurses)
))
インストールを行います。
$ guix package -f kconfig-frontends.scm
genromfsのインストール
tar xf genromfs-0.5.2.tar.gz
を展開します。
$ tar xf genromfs-0.5.2.tar.gz
Makefile
を以下のように修正します。
# Makefile for the genromfs program.
# all: genromfs
#PACKAGE = genromfs
VERSION = 0.5.2
CC = gcc
CFLAGS = -O2 -Wall -DVERSION=\"$(VERSION)\"#-g#
LDFLAGS = -s#-g
#DISTDIR = $(PACKAGE)-$(VERSION)
FILES = COPYING NEWS ChangeLog Makefile \
genromfs.8 genromfs.c genromfs.lsm \
readme-kernel-patch genrommkdev romfs.txt \
checkdist
DESTDIR:=
PREFIX:=out
bindir:= $(DESTDIR)$(PREFIX)/bin
genromfs: genromfs.c
$(CC) $(CFLAGS) $(LDFLAGS) genromfs.c -o genromfs
#.c.o:
# $(CC) $(CFLAGS) $< -c -o $@
clean:
rm -f genromfs *.o
install: genromfs
mkdir -p $(bindir)
cp $^ $(bindir)
圧縮します。
$ tar -zcvf genromfs-0.5.2.tar.gz genromfs-0.5.2
圧縮したgenromfs-0.5.2.tar.gz
を適当なパスに置きます。
ここでは/home/yutaka/temp/nuttx/temp/
に置いたものとします。
次に同じパスにgenromfs.scm
を作成し、中身は以下のようにします。
(use-modules
(guix packages)
(guix download)
(guix utils)
(guix git-download)
(guix build-system gnu)
(gnu packages flex)
(gnu packages bison)
(gnu packages gperf)
(gnu packages ncurses)
(guix licenses))
(package
(name "genromfs")
(version "0.01")
(source (origin
(method url-fetch)
(uri "file:///home/yutaka/temp/nuttx/temp/genromfs-0.5.2.tar.gz")
(sha256
(base32
"0bnci0jgncasr7d7lx8m52nbz49scb7lhr5gf5xddrrz9ywfnqsz"))
))
(build-system gnu-build-system)
(arguments
`(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")))
#:phases (modify-phases %standard-phases
(delete 'configure)
(delete 'check))))
(synopsis "genromfs")
(description
"sample")
(home-page "https://github.com/SaitoYutaka/guix-hello-package")
(license gpl3+))
インストールを行います。
$ guix package -f genromfs.scm
nuttxのビルド、実行
nuttxをビルドします。
バージョンはnuttx-10.1.0
を使用します。
(現時点の最新がnuttx-10.1.0のようだったので)
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps.git apps
$ cd nuttx
$ git checkout nuttx-10.1.0
$ cd ../apps
$ git checkout nuttx-10.1.0
ビルドします。
まず、tools/configure.sh
で引数に-l sim:nsh
を指定して実行します。
$ tools/configure.sh -l sim:nsh
このあと、make
コマンドを実行するのですが、以下のように環境変数を設定する必要があります。
$ make HOSTCC=gcc CC=gcc CPP=cpp
上記を実行するとnuttx
というバイナリが作成されます。
$ file nuttx
nuttx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, with debug_info, not stripped
実行してみます。
ログインid,パスワードはドキュメントに記載されています。
$ ./nuttx
nsh: mkrd: missing required argument(s)
login: admin
password:
User Logged-in!
NuttShell (NSH) NuttX-10.1.0
MOTD: username=admin password=Administrator
nsh>
ちょっと動かしてみます。
動いているようです。
nsh> help
help usage: help [-v] [<cmd>]
. cd echo hexdump mkrd rm time xd
[ cp exec kill mount rmdir true
? cmp exit losetup mv set uname
basename dirname false ls poweroff sleep umount
break dd free mkdir ps source unset
cat df help mkfatfs pwd test usleep
Builtin Apps:
hello nsh sh
nsh> hello
Hello, World!!
nsh>
まとめ
Guix上でもnuttxのシミュレータを動作させることができました。(ちょっと手間がかかりますが)
参考
Discussion