monolithic kernel

makeしたLinuxカーネルのバージョンに+ (プラス) が付いてしまう

Linuxカーネルをmakeすると、バージョンに+ (プラス) が付いたり付かなかったりします。これが厄介でならないので、なんとかやめさせられないか調べてみました。

結論から言うと、コードをGitで管理していて、かつdirtyな (コミットされていない変更が作業ディレクトリに存在する) 状態の場合に+が付きます。無効化するconfigはありません。私は参考のリンク先にあるようにscripts/setlocalversionの該当する処理をコメントアウトしてしまいましたが、あまりよいことをしている感じはしないので、実践するかどうかの判断は読者のみなさんにお任せします。

# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
        # full scm version string
        res="$res$(scm_version)"
#else
#       # append a plus sign if the repository is not in a clean
#       # annotated or signed tagged state (as git describe only
#       # looks at signed or annotated tags - git tag -a/-s) and
#       # LOCALVERSION= is not specified
#       if test "${LOCALVERSION+set}" != "set"; then
#         scm=$(scm_version --short)
#         res="$res${scm:++}"
#       fi
fi

余談ですが、シェルスクリプトではelse節の中身が空だとsyntax errorになるんですね。今まで知りませんでした。

それにしても、なんでこんな仕様になっているのでしょうか。開発中に+ありと+なしのどっちが更新されるのか常に意識しなければならないのはほんとに面倒です。GRUB_DEFAULTに頼れなくなってしまいますし。LOCALVERSION_AUTOでリビジョンが付くことと矛盾しないようにするためでしょうかね。だとしたらLOCALVERSION_AUTOを使っていない時には+を付ける処理も無効化してほしいものですが。

参考