レシピの作り方入門

14,275 views
13,827 views

Published on

2014/2/22 に開催された Yocto Japan の勉強会のプレゼンテーション資料です。

Published in: Technology
0 Comments
18 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
14,275
On SlideShare
0
From Embeds
0
Number of Embeds
246
Actions
Shares
0
Downloads
115
Comments
0
Likes
18
Embeds 0
No embeds

No notes for slide

レシピの作り方入門

  1. 1. レシピの作り方入門 岩松 信洋 メール: iwamatsu@nigauri.org Twitter: @iwamatsu
  2. 2. アジェンダ 1.自己紹介 2. Yoctoのビルド概要 3.レシピの作り方 4.まとめ
  3. 3. 自己紹介
  4. 4. 自己紹介 ● 名前: 岩松信洋(いわまつ のぶひろ) ● 大抵のアカウントは iwamatsu ● kuma dasu さんの紹介で発表することになりま した。 ● 普段は Linux kernel、U­Boot 、BSPの開発 ● U­Boot SH/rmobile Maintainer ● Debian Project Official Developer 
  5. 5. Debian からの刺客!?                        クルッ .                      ハ,,ハ    ミ  _ ドスッ      /1べ:;:;:r─‐-!         ( ゚ω゚ )彡―─┴┴─― .    /iィ.:.:.:.:ヾ|断だ!\        /   つ  お断りし /      ハ,,ハ    /ヘ レj_.:.:.lるが!  \    ~′ /´ └―─┬/       ( ゚ω゚ ) お断りします .  /.:`ソ =三_`y‐i:!    \    ∪ ∪      /        /    \  /.:::i゛:.. `ヾニノ  j!      .\           /       ((⊂  )   ノ\つ)) ./;;i::rミ、    ;:'  '!       . \∧∧∧∧∧D/             (_⌒ヽ 丶iゝ``'   ,:'  ,t'!         <     お e>           ヽ ヘ }    ` 丶 、 /rj!        < の し 断 b>      ε≡Ξ ノノ `J ────────────< 予 ま わ  i>────────────          ハ,,ハ  お断り<. 感 す り  a>         ______         ( ゚ω゚ )  します<. !!      n >        /   ./お だ ,!        __〃`ヽ 〈_      /∨∨∨∨\         /   ! 断 が,!    γ´⌒´--ヾvーヽ⌒ヽ /お断りします \       / ,ハ,,ハ ! り  ,!   /⌒  ィ    `i´  ); /.      ハ,,ハ     \    /( ゚ω゚ )`ー‐,!   /    ノ^ 、___¥__ /       ( ゚ω゚ )     \  `ヽ、   \_,!   !  ,,,ノ爻\_ _人 /        .(| y |)       \    `ヽ、ノ\,!
  6. 6. Yocto なんてぶっ 潰してやるぜ!
  7. 7. というわけではありません ので、安心してください。 Yocto なんてぶっ 潰してやるぜ!
  8. 8. Yoctoのビルド概要
  9. 9. ビルド概要 レシピ bitbake イメージ
  10. 10. ビルド概要/レシピとは? ● ソフトウェアのビルド、インストール方法が書 かれたテキストファイル ● シェルスクリプト + Python を混ぜて記述 ● ソース取得からパッケージ化までの動作を記述 ● 料理のレシピと同じようなもの
  11. 11. ビルド概要 レシピ core­image­minimal bitbake イメージ
  12. 12. ビルド概要 レシピ bitbake core­image­minimal 依存 busybox eglibc …… イメージ
  13. 13. ビルド概要 レシピ bitbake core­image­minimal 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… イメージ
  14. 14. ビルド概要 レシピ bitbake core­image­minimal 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… 依存 gettext­native zlib­native …… イメージ
  15. 15. ビルド概要 レシピ bitbake イメージ core­image­minimal 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… 依存 gettext­native zlib­native …… ビルド gettext­native zlib­native ……
  16. 16. ビルド概要 レシピ bitbake イメージ core­image­minimal 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… ビルド gcc­cross 依存 gettext­native zlib­native binutils­cross …… ビルド依存 …… ビルド gettext­native zlib­native ……
  17. 17. ビルド概要 レシピ bitbake イメージ core­image­minimal 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… ビルド ビルド busybox gcc­cross 依存 gettext­native zlib­native eglibc …… ビルド依存 binutils­cross …… ビルド依存 …… ビルド gettext­native zlib­native ……
  18. 18. ビルド概要 レシピ bitbake インストール core­image­minimal イメージ core­image­minimal.bz2 zImage 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… ビルド ビルド busybox gcc­cross 依存 gettext­native zlib­native eglibc …… ビルド依存 binutils­cross …… ビルド依存 …… ビルド gettext­native zlib­native ……
  19. 19. ビルド概要 *.conf レシピ bitbake インストール core­image­minimal イメージ core­image­minimal.bz2 zImage 依存 busybox eglibc 依存 gcc­cross binutils­cross …… …… ビルド ビルド busybox gcc­cross 依存 gettext­native zlib­native eglibc …… ビルド依存 binutils­cross …… ビルド依存 …… ビルド gettext­native zlib­native ……
  20. 20. ビルド概要/レイヤー
  21. 21. ビルド概要/レイヤー poky/meta busybox linux­yocto
  22. 22. ビルド概要/レイヤー poky/meta­yocto busybox poky/meta busybox linux­yocto
  23. 23. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto busybox poky/meta busybox linux­yocto myprogram
  24. 24. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto busybox poky/meta busybox myprogram linux­yocto ビルドディレクト リ/conf/bblayers.conf で定義
  25. 25. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto busybox poky/meta busybox myprogram linux­yocto ビルドディレクト リ/conf/bblayers.conf で定義
  26. 26. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto myprogram busybox 機能上書き poky/meta busybox linux­yocto ビルドディレクト リ/conf/bblayers.conf で定義
  27. 27. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto busybox myprogram 機能追加 機能上書き poky/meta busybox linux­yocto ビルドディレクト リ/conf/bblayers.conf で定義
  28. 28. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto busybox myprogram 機能追加 機能上書き poky/meta busybox linux­yocto ビルドディレクト リ/conf/bblayers.conf で定義 最終的な レシピ busybox linux­yocto myprogram
  29. 29. ビルド概要/レイヤー linux­yocto meta­foo poky/meta­yocto busybox myprogram 機能追加 機能上書き poky/meta busybox linux­yocto ビルドディレクト リ/conf/bblayers.conf で定義 最終的な レシピ busybox linux­yocto myprogram
  30. 30. ビルド概要/レシピ poky/meta­yocto/recipes­core/busybox/ |­­ busybox­1.20.2 |   `­­ poky­tiny |       `­­ defconfig `­­ busybox_1.20.2.bbappend poky/meta/recipes­core/busybox/ |­­ busybox­1.20.2 |   |­­ … |   `­­ wget_dl_dir_fix.patch |­­ busybox.inc |­­ busybox_1.20.2.bb `­­ files     |­­ …     `­­ umount.busybox
  31. 31. ビルド概要/レシピ poky/meta­yocto/recipes­core/busybox/ |­­ busybox­1.20.2 |   `­­ poky­tiny |       `­­ defconfig recipes­core/busybox/busybox_1.20.2.bbappend `­­ busybox_1.20.2.bbappend + poky/meta/recipes­core/busybox/ |­­ busybox­1.20.2 |   |­­ … |   `­­ wget_dl_dir_fix.patch |­­ busybox.inc |­­ busybox_1.20.2.bb `­­ files     |­­ …     `­­ umount.busybox recipes­core/busybox/busybox_1.20.2.bb bbappend で定義した 内容が上書きされた busybox_1.20.2.bb
  32. 32. レシピの作り方
  33. 33. レシピの作り方 ● レシピのひな形を作成 ● レシピ説明、セクション名の定義 ● ライセンス定義 ● ソースファイル定義 ● タスク定義 ● その他変数
  34. 34. レシピの作り方 ● yocto­layer create でひな形作成 $ ./poky/scripts/yocto­layer create my­recipes
  35. 35. レシピの作り方 ● yocto­layer create でひな形作成 $ ./poky/scripts/yocto­layer create my­recipes Please enter the layer priority you'd like to use for the layer: [default: 6] 6 Would you like to have an example recipe created? (y/n) [default: n] y Please enter the name you'd like to use for your example recipe: [default: example]  Would you like to have an example bbappend file created? (y/n) [default: n] n New layer created in meta­my­recipes. Don't forget to add it to your BBLAYERS (for details see meta­my­recipesREADME). カレントディレクトリにmeta­my­recipes ディレクトリが作成 され、そこにひな形が作成される
  36. 36. 実行後のディレクトリ構成 meta­my­recipes   |­­ COPYING.MIT   |­­ README   |­­ conf   |   `­­ layer.conf   |­­ recipes­example      `­­ example          |­­ example­0.1          |   |­­ example.patch          |   `­­ helloworld.c          `­­ example_0.1.bb
  37. 37. example_0.1.bb レシピ名: example バージョン: 0.1 として処理される。 レシピ名とバージョンは _ (アンダースコア)で 区切る。
  38. 38. example_0.1.bb DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://$ {COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() {              ${CC} helloworld.c ­o helloworld } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  39. 39. レシピ説明、セクション名の定義 DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://$ {COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() {              ${CC} helloworld.c ­o helloworld } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  40. 40. レシピ説明、セクション名の定義 ● DESCRIPTION: レシピの説明 ­ 簡単な説明は SUMMARY を使う ● SECTION: レシピが所属するセクション ­ 一応ビルド時にチェックされる (meta/classes/oelint.bbclass)
  41. 41. ライセンス定義 DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://$ {COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() {              ${CC} helloworld.c ­o helloworld } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  42. 42. ライセンス定義 ● LICENSE: ライセンス名 ● LIC_FILES_CHKSUM: ファイル名とmd5 ­ COPYING 、LICENSE ファイルのパス ­ ファイルのライセンスヘッダ部を参照する場合もある file://ファイル名;beginline=5;endline=20;md5=チェックサム値 (指  定されたファイルの5行目から20行目にあるライセンスヘッダのmd5   チェックサムを確認する。) ­ COMMON_LICENSE_DIRはmeta/files/common­licenses/ がデ フォルト値
  43. 43. ソースファイル定義 DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://$ {COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() {              ${CC} helloworld.c ­o helloworld } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  44. 44. ソースファイル定義 ● SRC_URI: ソースファイルの一覧 ­ ソースファイルはビルドに必要なパッチや設 定ファイルを含む ­ スペースで区切る ● 様々なプロトコルをサポート file、git、svn、http、etc...
  45. 45. タスク定義 DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://$ {COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() {              ${CC} helloworld.c ­o helloworld } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  46. 46. タスク定義 ● Bitbake によってビルド時に実行される処理 ● 基本タスクと実行される順番が決まっている 1. do_fetch: SRC_URI で指定された場所からソースコードをダウンロード 2. do_unpack: ソースコードを展開 3. do_patch: ローカルパッチを適用 4. do_configure: configureを実行 5. do_compile: makeを実行 6. do_install: make install を実行 7. do_populate_sysroot: sysroot にインストール 8. do_package: パッケージ化用のディレクトリにインストール 9. do_package_write: パッケージの作成(ipk, deb, rpm) 10. do_build: ビルド終了用のタスク
  47. 47. タスク定義 ● Bitbake によってビルド時に実行される処理 ● 基本タスクと実行される順番が決まっている 1. do_fetch: SRC_URI で指定された場所からソースコードをダウンロード 2. do_unpack: ソースコードを展開 3. do_patch: ローカルパッチを適用 4. do_configure: configureを実行 5. do_compile: makeを実行 実際に実行されるタスクは bitbake ­c listtasks レシピ名 で確認できる 6. do_install: make install を実行 7. do_populate_sysroot: sysroot にインストール 8. do_package: パッケージ化用のディレクトリにインストール 9. do_package_write: パッケージの作成(ipk, deb, rpm) 10. do_build: ビルド終了用のタスク
  48. 48. タスク定義 $ bitbake ­c listtasks busybox do_fetchall do_devshell do_package_write_ipk do_cleansstate do_build do_configure do_cleanall do_populate_lic do_package_write do_populate_sysroot do_package_setscene do_menuconfig do_populate_lic_setscene do_packagedata_setscene do_patch do_packagedata do_listtasks do_checkuriall do_compile do_fetch do_checkuri do_clean do_package_write_ipk_setscene do_package do_unpack do_install do_populate_sysroot_setscene
  49. 49. タスク定義 1. do_fetch: SRC_URI で指定された場所からソースコードをダウンロード 2. do_unpack: ソースコードを展開 3. do_patch: ローカルパッチを適用 4. do_configure: configureを実行 5. do_compile: makeを実行 6. do_install: make install を実行 7. do_populate_sysroot: sysroot にインストール 8. do_package: パッケージ化用のディレクトリにインストール 9. do_package_write: パッケージの作成(ipk, deb, rpm) 10. do_build: ビルド終了用のタスク
  50. 50. タスク定義 1. do_fetch: SRC_URI で指定された場所からソースコードをダウンロード 2. do_unpack: ソースコードを展開 3. do_patch: ローカルパッチを適用 4. do_configure: configureを実行 ● 5. do_compile: makeを実行 ● ● 6. do_install: make install を実行 タスクは上書き、追加ができる タスク間には依存関係がある 自作のタスクを定義可能できる 7. do_populate_sysroot: sysroot にインストール 8. do_package: パッケージ化用のディレクトリにインストール 9. do_package_write: パッケージの作成(ipk, deb, rpm) 10. do_build: ビルド終了用のタスク
  51. 51. タスク定義の上書き、追加 ● タスクの上書き do_configure() {     echo ''Override do_configure''  } ● タスクの追加 do_compile_append() {              touch ${S}/test } _append はタスクの処理後に追加する。タスク処理前 は_prependをつける
  52. 52. タスク定義の依存関係と作成 ● タスク間には依存関係がある addtask package before do_build after do_install package タスクをbuildの前、installの後に実行する ● 自作のタスクを定義できる addtask mytask before do_patch after do_unpack do_mytask() {     ...... } mytask タスクをpatchの前、unpackの後に実行する用 設定
  53. 53. その他変数 DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://$ {COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() {              ${CC} helloworld.c ­o helloworld } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  54. 54. その他変数 PR: レシピのリビジョン。レシピを更新した時に インクリメントする。初めて作った時は必要な い。 ● S: ソースディレクトリ。展開済みのソースディ レクトリ ● WORKDIR: レシピの作業が行われるディレクト リ。 ● D: インストール先ディレクトリ ● bindir: /usr/bin ●
  55. 55. その他変数 PN: レシピ(パッケージ)名 ● PV: レシピ(パッケージ)のバージョン ● DEPENDS: ビルドに必要なレシピ ● DEPENDS = ''zlib openssl'' RDEPENDS: 実行に必要なパッケージ(or レシピ) ● EXTRA_OECONF: configure実行時に渡すオプショ ン ● EXTRA_OEMAKE: make実行時に渡すオプション ● その他たくさん... ●
  56. 56. その他 ● autotools や pkg-config を使った手順は? 基本機能をまとめたクラスが提供されている。 inherit 命令を使って機能を継承する。 inherit autotools pkg-config ● レシピ共通の項目をまとめたい include命令が使える。項目をまとめたファイルを指定。 include boost.inc
  57. 57. その他変数 PN: レシピ(パッケージ)名 ● PV: レシピのバージョン ● DEPENDS: ビルドに必要なレシピ ● DEPENDS = ''zlib openssl'' RDEPENDS: 実行に必要なパッケージ(or レシピ) ● EXTRA_OECON: configure 実行時に渡すオプション ●
  58. 58. レシピのビルド ● meta­my­recipesのパスを conf/bblayers.conf の BBLAYERS に追加する   BBLAYERS ?= "                                                                     /home/iwamatsu/yocto/test/poky/meta     /home/iwamatsu/yocto/test/poky/meta­yocto    /home/iwamatsu/yocto/test/poky/meta­yocto­bsp     /home/iwamatsu/yocto/test/meta­my­recipes     "  
  59. 59. レシピのビルド ● bitbake­layers show­layers でビルド環境のレイヤーのを チェックする $ bitbake­layers show­layers layer                 path                                      priority ========================================== …… meta­yocto­bsp         /home/iwamatsu/yocto/test/poky/meta­yocto­bsp  5 meta­my­recipes       /home/iwamatsu/yocto/test/meta­my­recipes  6   
  60. 60. レシピのビルド ● bitbake­layers show­recipes でビルド環境のレイヤーの をチェックする $ bitbake­layers show­recipes | grep ­A 1 ^example Parsing recipes..done. example:   meta­my­recipes      0.1  
  61. 61. レシピのビルド ● bitbake example を実行する $ bitbake example Build Configuration: BB_VERSION        = "1.18.0" BUILD_SYS         = "x86_64­linux" NATIVELSBSTRING   = "Unknown" TARGET_SYS        = "i586­poky­linux­uclibc" MACHINE           = "hoge" DISTRO            = "hogefoo" DISTRO_VERSION    = "1.4.2" TUNE_FEATURES     = "m32 i586" TARGET_FPU        = "" meta               meta­yocto         meta­yocto­bsp    = "dylan:d734ab491a30078d43dee5440c03acce" meta­my­recipes   = "<unknown>:<unknown>" ……
  62. 62. 既存のレシピの変更方法 .bbを直接変更しない ● .bbappendファイルを作成して上書き(オーバー ライド)する ● .bbappendファイルで上書きするときは、レシピ 名(PN)とレシピのバージョン(PV)が同じである必 要がある。 ●
  63. 63. 既存のレシピの変更方法 ● meta­my­recipes/recipes­example/example 以下 にexample_0.1.bbappend を作成する install タスクに ${S}/test ファイルを作成する処 理を追加 do_install_append() {         touch ${S}/test } 
  64. 64. 既存のレシピの変更方法 ● bitbake­layers show­appends でレシピの変更状 態を確認する $ bitbake­layers show­appends | grep ^example ­A 1 Parsing recipes..done. example_0.1.bb:    /home/iwamatsu/yocto/test/meta­my­recipes/recipes­ example/example/example_0.1.bbappend
  65. 65. 既存のレシピの変更方法 ● bitbake example を再度実行
  66. 66. 既存のレシピの変更方法 ● bitbake example を再度実行 do_install_append() {         touch ${S}/test }  example_0.1.bbappendの install タスク example_0.1.bbの install タスク do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} }
  67. 67. 既存のレシピの変更方法 ● bitbake example を再度実行 do_install_append() {         touch ${S}/test }  example_0.1.bbappendの install タスク example_0.1.bbの install タスク do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir} } do_install() {              install ­d ${D}${bindir}              install ­m 0755 helloworld ${D}${bindir}              touch ${S}/test }
  68. 68. まとめ
  69. 69. まとめ ● レシピはソフトウェアのビルド、インストール方法が書かれたテキストファ イル ● シェルスクリプト + Python を混ぜて記述 ● ソース取得からパッケージ化までの動作を記述 ● 各レシピは依存関係を持つ ● 変数とタスクが定義されている ● 変数とタスクは変更可能 ● yocto­layer create でひな形が作成できる ● bitbake­layers でビルド環境の確認ができる ● レシピを変更するときは .bbappend を使って上書きする
  70. 70. 質問ありますか?

×