👩‍🌾

nuttxのシミュレータをGuix上で動かす

2021/07/27に公開

はじめに

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 [パッケージ名]
行うのですが、genromfskconfig-frontendsは無いので自前でビルドする必要があります。

kconfig-frontends, genromfsのインストール

インストールの大まかな流れは以下です。

  1. https://bitbucket.org/nuttx/tools/src/master/ からコード取得
  2. kconfig-frontendsのインストール
    1. kconfig-frontendsディレクトリをkconfig-frontends.tar.gzで圧縮
    2. パッケージkconfig-frontends.scmの作成
    3. guix package -f kconfig-frontends.scmでインストール
  3. genromfsのインストール
    1. https://bitbucket.org/nuttx/tools/src/master/ から取得したコードの中のgenromfs-0.5.2.tar.gzを展開しMakefileの修正
    2. 展開して出来たgenromfs-0.5.2ディレクトリをgenromfs-0.5.2.tar.gzで圧縮
    3. パッケージgenromfs.scmの作成
    4. guix package -f genromfs.scmでインストール

となります。以下に詳細を記載します。

kconfig-frontendsのインストール

kconfig-frontendsディレクトリを圧縮します。

$ tar -zcvf kconfig-frontends.tar.gz kconfig-frontends

圧縮したkconfig-frontends.tar.gzを適当なパスに置きます。
ここでは/home/yutaka/temp/nuttx/temp/に置いたものとします。

次に同じパスにkconfig-frontends.scmを作成し、中身は以下のようにします。

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
# 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を作成し、中身は以下のようにします。

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のシミュレータを動作させることができました。(ちょっと手間がかかりますが)

参考

https://zenn.dev/saitoyutaka/articles/fe12c982e89a7b

Discussion