devtoolの使い方 (2):レシピの作成(add)とビルド
前回はdevtoolの導入と簡単な流れを説明しました。今回は実際にaddコマンドを使ってレシピを作成していきます。Hello World代わりにslコマンドを題材にしてみます。
devtool status
最初に状況を確認するためのコマンドを試しておきます。git statusと似たようなものですね。
devtool status
実行結果は下記のようになります。devtoolによる操作が初めての場合は下記のようにworkspaceが作成され、bblayers.confに自動で追加されます。この結果の中では一番最後の行の「workspace内にレシピがないよ、修正するならmodify、追加するならaddを使え」というのが本来のstatusの結果になります。
sakate@walle:~/git/poky/build$ devtool status
NOTE: Creating workspace layer in /home/sakate/git/poky/build/workspace
NOTE: Enabling workspace layer in bblayers.conf
NOTE: No recipes currently in your workspace - you can use "devtool modify" to work on an existing recipe or "devtool add" to add a new one
conf/bblayers.conf
一番最後の行にworkspaceが追加されています。
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/sakate/git/poky/meta \
/home/sakate/git/poky/meta-poky \
/home/sakate/git/poky/meta-yocto-bsp \
/home/sakate/git/poky/build/workspace \
"
statusコマンドで作成されたディレクトリとファイル
今はconfディレクトリしかありませんが、レシピを作成するとここにフォルダが増えてきます。先ほどbblayers.confにこのworkspaceが追加されましたのでこのディレクトリにできるレシピはbitbakeからビルドできるようになります。
sakate@walle:~/git/poky/build$ tree workspace/
workspace/
├── README
└── conf
└── layer.conf
1 directory, 2 files
addコマンドによるレシピ新規作成
それでは本題のレシピの作成です。Development Manual を見てみると図では開始が左・中央・右の3パターンに分かれています。引数の与え方で開始の仕方が変わります。今回は左のパターンを使います。
- 左 (devtool add recipe fetchuri):gitからソースツリーを取得する場合
- 中央(devtool add recipe srctree fetchuri):gitからソースツリーを取得するがソースの展開先を指定したい場合
- 右 (devtool add recipe srctree):すでにソースツリーがローカルに存在している場合
下記のように、今回は既存のgitリポジトリとしてslコマンドのgitリポジトリを指定します。addのあとの引数slはこれから作成するレシピの名前になります。
devtool add sl https://github.com/mtoyoda/sl
実行結果はこのようになります。resipes/sl/sl_git.bbにレシピが追加されました。このレシピを編集していくことになります。レシピが生成されるのでgit add(コミット対象に追加)とは動作が違いますね。先走って書くとdevtool finishをすることでgit commitに近いようなレシピの作成完了を表すことになります。
sakate@walle:~/git/poky/build$ devtool add sl https://github.com/mtoyoda/sl
NOTE: Using default source tree path /home/sakate/git/poky/build/workspace/sources/sl
NOTE: Using source tree as build directory since that would be the default for this recipe
NOTE: Recipe /home/sakate/git/poky/build/workspace/recipes/sl/sl_git.bb has been automatically created; further editing may be required to make it fully functional
treeでファイル構成を確認します。appends, recipes, sourcesが追加されたことがわかります。appendsはなんでしょうか。recipesとsourcesはそれぞれ生成されたレシピと、gitから取得したソースツリーですね。
sakate@walle:~/git/poky/build$ tree workspace/
workspace/
├── README
├── appends
│ └── sl_git.bbappend
├── conf
│ └── layer.conf
├── recipes
│ └── sl
│ └── sl_git.bb
└── sources
└── sl
├── LICENSE
├── Makefile
├── README.ja.md
├── README.md
├── demo.gif
├── sl.1
├── sl.1.ja
├── sl.c
└── sl.h
6 directories, 13 files
appends/sl_git.bbappend の中身を見てみましょう。拡張子がbbappendなのでこれから編集するレシピの設定を上書きするようなファイルです。中身はexternalsrcを使って、ローカルにあるソースツリーを指定してgitから新たに取得し直さないようになっています。この設定があるので、slコマンドを直接編集しても変更が反映されます。
inherit externalsrc
EXTERNALSRC = "/home/sakate/git/poky/build/workspace/sources/sl"
EXTERNALSRC_BUILD = "/home/sakate/git/poky/build/workspace/sources/sl"
# initial_rev: 923e7d7ebc5c1f009755bdeb789ac25658ccce03
ちなみに現在のステータスは下記のようになっています。
sakate@walle:~/git/poky/build$ devtool status
sl: /home/sakate/git/poky/build/workspace/sources/sl (/home/sakate/git/poky/build/workspace/recipes/sl/sl_git.bb)
ビルドを通す
まだ生成されたレシピの中身を見ていませんが、あとで編集するので一旦ビルドしてみましょう。下記コマンドでビルドできます。
devtool build sl
ビルド結果はエラーです。これを見ながらレシピやソースを編集していくことになります。編集する内容はケースバイケースだと思います。 curses.hが見つからずにビルドエラーになっているようです。
sakate@walle:~/git/poky/build$ devtool build sl
Loading cache: 100% |############################################| Time: 0:00:00
Loaded 1318 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:00:00
Parsing of 865 .bb files complete (864 cached, 1 parsed). 1319 targets, 50 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Build Configuration:
BB_VERSION = "1.32.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "universal-4.9"
TARGET_SYS = "i586-poky-linux"
MACHINE = "qemux86"
DISTRO = "poky"
DISTRO_VERSION = "2.2.1"
TUNE_FEATURES = "m32 i586"
TARGET_FPU = ""
meta
meta-poky
meta-yocto-bsp
workspace = "morty:924e576b8930fd2268d85f0b151e5f68a3c2afce"
Initialising tasks: 100% |#######################################| Time: 0:00:00
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
sl-1.0+git999-r0 do_compile: NOTE: sl: compiling from external source tree /home/sakate/git/poky/build/workspace/sources/sl
ERROR: sl-1.0+git999-r0 do_compile: oe_runmake failed
ERROR: sl-1.0+git999-r0 do_compile: Function failed: do_compile (log file is located at /home/sakate/git/poky/build/tmp/work/i586-poky-linux/sl/1.0+git999-r0/temp/log.do_compile.17951)
ERROR: Logfile of failure stored in: /home/sakate/git/poky/build/tmp/work/i586-poky-linux/sl/1.0+git999-r0/temp/log.do_compile.17951
Log data follows:
| DEBUG: Executing python function externalsrc_compile_prefunc
| NOTE: sl: compiling from external source tree /home/sakate/git/poky/build/workspace/sources/sl
| DEBUG: Python function externalsrc_compile_prefunc finished
| DEBUG: Executing shell function do_compile
| NOTE: make -j 4
| ERROR: oe_runmake failed
| gcc -O -Wall -o sl sl.c -lncurses
| sl.c:41:20: fatal error: curses.h: No such file or directory
| #include <curses.h>
| ^
| compilation terminated.
| Makefile:15: recipe for target 'sl' failed
| make: *** [sl] Error 1
| ERROR: Function failed: do_compile (log file is located at /home/sakate/git/poky/build/tmp/work/i586-poky-linux/sl/1.0+git999-r0/temp/log.do_compile.17951)
ERROR: Task (/home/sakate/git/poky/build/workspace/recipes/sl/sl_git.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 364 tasks of which 362 didn't need to be rerun and 1 failed.
Summary: 1 task failed:
/home/sakate/git/poky/build/workspace/recipes/sl/sl_git.bb:do_compile
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.
最初は解消方法がわからず悩みましたが、Makefileを修正しないと今のままだとホストのツールチェーンを指定していることがわかりました。編集する前にブランチを確認しておきましょう。
cd workspace/sources/sl/
git branch
実行結果は下記です。devtoolが勝手にブランチを作ってくれていたようです。そのまま安心して編集できますね。
sakate@walle:~/git/poky/build/workspace/sources/sl$ git br
* devtool
master
Makefileを下記のように編集しました。$CC, $CFLAGSはYocto側で指定したものを使用したいので、ここで上書きされないように行を削除しています。また、LDFLAGSはなくてもdevtool buildは通るのですが、最終的にbitbakeでビルドするときにQAで警告が出るので$LDFLAGSもつけておきます。
diff --git a/Makefile b/Makefile
index c3005d2..33b7a2e 100644
--- a/Makefile
+++ b/Makefile
@@ -6,13 +6,10 @@
# Last Modified: 2014/03/31
#==========================================
-CC=gcc
-CFLAGS=-O -Wall
-
all: sl
sl: sl.c sl.h
- $(CC) $(CFLAGS) -o sl sl.c -lncurses
+ $(CC) $(CFLAGS) ${LDFLAGS} -o sl sl.c -lncurses
clean:
rm -f sl
この修正でビルドが通るようになります。少し長くなってきたので続きは次回にします。次回はレシピの編集の残りと、QEMU上での動作確認になります。