1. 程式人生 > >kernel編譯時對svn版本的檢查

kernel編譯時對svn版本的檢查

背景:
1.使用svn管理下的kernel原始碼,在編譯完安裝的時候會生成一個帶有“+”的字串,用來表示版本號;
2.使用不在svn管理下的kernel原始碼,在編譯完安裝的時候會生成一個不帶有”+”的字串。

問題:
我使用在svn管理下的kernel原始碼編譯kernel和ko檔案,然後把ko載入到不在svn管理下的kernel的系統中,就遇到了提示:說ko應該是載入到帶有“+”的kernel版本中,但是現在的kernel不帶有“+”。
看起來有點繞,不過意思應該已經表明了。

解決:
1.首先發現這個是否帶有“+”的現象是由於使用了在svn管理下和不在svn管理下的兩個版本引起的。
2.偷懶了,沒有直接緊跟看程式碼,而是去網上搜了。於是搜到了:

https://blog.csdn.net/adaptiver/article/details/7225980 和類似的帖子。
文章很有用,為我指明瞭方向。然後跟著文章看了一遍確認是版本號引起的,然後回去看一下scripts/setlocalversion的實現,最終找到了問題。其實兩份kernel是一模一行的,唯一的區別就是一個svn管理的,另一個是用cp從前者複製出來的。
具體問題出現在:

159 # scm version string if not at a tagged commit
160 if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
161 # full scm version string 162 res="$res$(scm_version)" 163 else 164 # append a plus sign if the repository is not in a clean 165 # annotated or signed tagged state (as git describe only 166 # looks at signed or annotated tags - git tag -a/-s) and 167 # LOCALVERSION= is not specified 168
if test "${LOCALVERSION+set}" != "set"; then 169 scm=$(scm_version --short) 170 res="$res${scm:++}" 171 fi 172 fi 173

雖然沒在svn管理下的版本也進入了170行,但是scm這個變數的值是空的,因為它呼叫scm_version的時候不能獲取svn到的版本號,所以res的值就沒有“+”。

解決的方法就是先在svn管理下的kernel中用:

$(srctree)/scripts/setlocalversion --save-scmversion

生成一個.scmversion的隱藏檔案,裡面會記錄svn的版本號。
然後把這個檔案也一起復制到不在svn管理下的原始碼中,再編譯它就會生成帶有“+”的版本號了。