kernel編譯時對svn版本的檢查
背景:
1.使用svn管理下的kernel原始碼,在編譯完安裝的時候會生成一個帶有“+”的字串,用來表示版本號;
2.使用不在svn管理下的kernel原始碼,在編譯完安裝的時候會生成一個不帶有”+”的字串。
問題:
我使用在svn管理下的kernel原始碼編譯kernel和ko檔案,然後把ko載入到不在svn管理下的kernel的系統中,就遇到了提示:說ko應該是載入到帶有“+”的kernel版本中,但是現在的kernel不帶有“+”。
看起來有點繞,不過意思應該已經表明了。
解決:
1.首先發現這個是否帶有“+”的現象是由於使用了在svn管理下和不在svn管理下的兩個版本引起的。
2.偷懶了,沒有直接緊跟看程式碼,而是去網上搜了。於是搜到了:
文章很有用,為我指明瞭方向。然後跟著文章看了一遍確認是版本號引起的,然後回去看一下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管理下的原始碼中,再編譯它就會生成帶有“+”的版本號了。