fedora カーネルパッケージのバージョンの付け方の謎

このタイトルだと謎とは何ぞや?となる人が多いと思います・・・ どういうことかというと、2015/11/12の時点ではカーネル 4.4のマージウィンドウが開いている段階で、カーネルMakefileに書かれているバージョンは4.3です。 これを書いている時の最新のコミットだとこうなってます。

VERSION = 4
PATCHLEVEL = 3
SUBLEVEL = 0
EXTRAVERSION =
NAME = Blurry Fish Butt

で、fedora rawhide(今の時点ではfedora 24)のカーネルパッケージは4.4系のバージョン番号になっています。 f:id:masami256:20151113234456p:plain

そして、タイトルの「fedora rawhideのカーネルパッケージのバージョンの付け方の謎」になるわけです。

この謎を調べるためにはkernel.specを見る必要があります。 まずは、現時点でのsoucesファイルを見るとベースは4.3系なことがわかります。

58b35794eee3b6d52ce7be39357801e7  linux-4.3.tar.xz
7c516c9528b9f9aac0136944b0200b7e  perf-man-4.3.tar.gz
7969fc8a820c526832269b78dbef685b  patch-4.3-git8.xz

次にkernel.specを見ましょう。

最初にリリース版のカーネルかどうかの変数があります。4.4系はまだリリース版のカーネルではないので0になってます。

# For a stable, released kernel, released_kernel should be 1. For rawhide
# and/or a kernel built from an rc or git snapshot, released_kernel should
# be 0.
%global released_kernel 0

ここから下に進んでいくと、リリース版じゃないカーネルの場合のバージョン番号をセットする箇所が見つかります。

## The not-released-kernel case ##
%else
# The next upstream release sublevel (base_sublevel+1)
%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
# The rc snapshot level
%define rcrev 0
# The git snapshot level
%define gitrev 8
# Set rpm version accordingly
%define rpmversion 4.%{upstream_sublevel}.0
%endif

まず、一番最後のところですが、ここで4.4.0のようなバージョンが作られますね。なので、upstream_sublevelが4.xのxの部分ですね。

%define rpmversion 4.%{upstream_sublevel}.0

ここは下のようになっていて、base_sublevelの値+1のバージョンが設定されるようです。

%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))

base_sublevelは上記の設定箇所より前で設定されてます。ここは機械的に設定されるのではなくて、必要に応じて書き換えてる感じですね。 3.1のrc7だとベースになるのは3.0ということなので、4.4のrcということはbase_sublevelは4.3の3ということっぽいです。

# base_sublevel is the kernel version we're starting with and patching
# on top of -- for example, 3.1-rc7-git1 starts with a 3.0 base,
# which yields a base_sublevel of 0.
%define base_sublevel 3

というわけで、upstream_sublevelはbase_sublevelに1を足しているので4になります。

%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))

そして、ここで4.4.0という番号が作られるということです。

%define rpmversion 4.%{upstream_sublevel}.0

最後にgitのリビジョンやrcの番号は

# non-released_kernel
%if 0%{?rcrev}
%define rctag .rc%rcrev
%else
%define rctag .rc0
%endif
%if 0%{?gitrev}
%define gittag .git%gitrev
%else
%define gittag .git0
%endif
%define pkg_release 0%{?rctag}%{?gittag}.%{fedora_build}%{?buildid}%{?dist}

2015/11/12時点ではnon-releasedカーネルなのでrcrevには0が設定されているのでrctagは.rc0になります。 ↓の部分ですね。

# The rc snapshot level
%define rcrev 0

gitのリビジョンは下のように8が設定されているので、gittagは.git8というふうになります。

# The git snapshot level
%define gitrev 8

それで最終的に細かいバージョン番号を↓のように設定しています。

%define pkg_release 0%{?rctag}%{?gittag}.%{fedora_build}%{?buildid}%{?dist}

buildidはspecファイル内で再定義しない場合は1からインクリメントされていってると思います。distは現時点での最新のfc24です。 そうすると0.rc0.git8.1.fc24となります。

最後にrpmversionとpkg_releaseを合わせるとkernel-4.4.0-0.rc0.git8.1.fc24となるわけです。

プロのための Linuxシステム・10年効く技術 (Software Design plus)

プロのための Linuxシステム・10年効く技術 (Software Design plus)