Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Yocto でパッケージにパッチをあてる方法

More than 3 years have passed since last update.

この記事は SmartDrive Advent Calendar 2017 の 23 日目の記事です。

SmartDrive でバックエンドエンジニアをしている @ahoki です。
弊社では、デバイスのファームウェアの開発をしており、一部のデバイスでは Yocto を使用してカスタマイズして組込 Linux の環境を構築しています。

Yocto ではいろいろなパッケージを自分で簡単に追加することができますが、パッケージをそのまま使うのではなくて、ソースコードに手を入れて使用したいということが度々起こりえます。
本記事では NXP 社の i.MX7 の Yocto Linux を例としてパッチを当てる方法を紹介したいと思います。

パッチをあてるところ

今回は例として、i.MX7 のプロセッサのクロックをデフォルト設定よりも低くできるようにします。
具体的にはソースコード (Device Tree Source) の下記になります。

*
/tmp/work/imx7dsabresd-poky-linux-gnueabi/linux-imx/4.1.15-r0/git/arch/arm/boot/dts/imx7d.dtsi*

cpu0: cpu@0 {
        compatible = "arm,cortex-a7";
        device_type = "cpu";
        reg = <0>;
        operating-points = <
                /* KHz  uV */
                1200000 1225000
                996000  1075000
                792000  975000
                396000  975000 ★追記
                198000  975000 ★追記
        >;
        clock-latency = <61036>; /* two CLK32 periods */
        clocks = <&clks IMX7D_ARM_A7_ROOT_CLK>, <&clks IMX7D_ARM_A7_ROOT_SRC>,
                 <&clks IMX7D_PLL_ARM_MAIN_CLK>, <&clks IMX7D_PLL_SYS_MAIN_CLK>;
        clock-names = "arm", "arm_root_src", "pll_arm", "pll_sys_main";
};

安直にパッチを当てる方法

一番単純な方法はダウンロードして展開先のファイルを直接書き換えてビルドし直す方法です。

下では DISTRO="X11", MACHINE="sato"のケースを例としています。

vi tmp/work-shared/imx7dsabresd/kernel-source/arch/arm/boot/dts/imx7d-sdb.dts ★ファイルを編集
bitbake linux-imx -c compile -f
bitbake core-image-sato

${YOCTO_ROOTDIR} 直下の tmp/work または tmp/work-shared に展開されたソースコードがあるのでそれを直接編集しています。
その後、bitbake コマンドに -f をつけることで強制的に指定したパッケージに対してコンパイルし直しています。

ただし、この方法はちょっとしたお試しでやるにはいいですが、新たにビルドする度にファイルを編集する必要があるため、継続的に使用する環境では現実的ではありません。

レシピを使ったパッチの当てる方法

パッチの適用を構成管理できるようにするためにはレシピを作成する必要があります。

Gitフォーマットパッチの作成

まず、下記のようにパッチファイルを作成します。

cd tmp/work-shared/imx7dsabresd/kernel-source
vi arch/arm/boot/dts/imx7d-sdb.dts ★ファイルを編集
git add arch/arm/boot/dts/imx7d-sdb.dts
git commit -s -m "Add cpu clock down options"
git format-patch -1

レシピファイルの作成

次に作成したパッチファイルをあてるためのレシピを作成します。
レシピファイルは <パッケージ名>_<バージョン>.bbappend という形式のファイル名にするのが習わしです。 (今回は linux-imx_4.1.15.bbappend )
また、パッチファイルは <パッケージ名>-<バージョン>/ ディレクトリ以下に置きます。

mkdir -p meta-example/recipe-kernel/linux/linux-<version>
cd meta-example/recipe-kernel/linux/
cp <patch file> linux-imx-4.1.15
vi linux-imx_4.1.15.bbappend

<version> の部分については適宜自分が使っている Linux の Kernel バージョンに合わせて記載します。

linux_<version>.bbappend は下記のように記載します。

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:"

SRC_URI += " \
    file://0001-Add-cpu-clock-down-options.patch \ |
"

先頭一行目はパッチファイルを置いたディレクトリを指定しています。
また、 SRC_URI はパッチファイル名を指定しています。

Yocto ビルドにレシピファイルの置き場を指定する

このままでは Bitbake でレシピファイルが見つけられないので、ありかを教えてあげる必要があります。
そのためには、conf/bblayers.conf に下記を追記します。

BBLAYERS += " ${BSPDIR}/meta-example "

構成管理

本例では meta-example 以下および conf/bblayers.conf を構成管理しておけばパッチを適用済みの環境を繰り返し構築することができます。

まとめ

手順を示したようにレシピを使ってパッチを適用するのは結構面倒です。
まずはソースコードを直接書き換えてビルドすることで、パッチの効果を確認した上でレシピを作成して管理することをおすすめします。

ahoki
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away