Chapter 22. 增加一個新的 kernel 組態選項

Table of Contents
22.1. 什麼是 Kernel 選項
22.2. 現在我應該怎麼做?

Contributed by Jörg Wunsch

Note: 本章假設您已經熟悉在 kernel configuration 的相關事物。

22.1. 什麼是 Kernel 選項

使用 kernel 選項 (options) 的方法在 kernel configuration 部份已經說明。 本文也將說明 "historic" 以及 "new-style" 選項。 目標是希望能將 kernel 中的選項都轉換成新的格式, 才能在執行 config(8) 以及 make depend之後, 自動地只編譯那些因修改過的選項或其他原因而造成異動的檔案。 而不會像以前每執行 config(8) 就會把所有的檔案做不必要的刪除。

基本上,kernel 選項只是 kernel 編譯過程需要的 C 前置定義 (preprocessor macro)。為了讓整個編譯過程合理, 在 kernel 程式碼 (或說是 .h 檔) 必須針對此項設計改寫,也就是說,預設的選項必須能被組態中的選項覆寫。 這項功能通常是這樣做:

    #ifndef THIS_OPTION
    #define THIS_OPTION (some_default_value)
    #endif /* THIS_OPTION */

這樣的話,當管理者在它的組態檔中加入了另一個選項, 預設的選項就會被新的值所取代.也就因此, 新的值必須是一個有效的 C 程式碼中的敘述。

也可以有一些選項的設定方式是打開或關上某個功能。 下面的程式可以做到:

    #ifdef THAT_OPTION
    
    [your code here]
    
    #endif

在組態檔中設定 THAT_OPTION (有值或沒有值都可以) 會將程式中的某些功能打開。

熟悉 C 語言的人應該會發現每一個 "config option" 都會有其對應的 #ifdef。 我想應該不會有人在組態檔中加入

    options		notyet,notdef

若是這樣的話,他們在改 kernel 程式時可能會常常有困擾。 :-)

由此可見,對於 options 任意命名, 將使得要在 kernel 程式碼中找到相關得資訊變得困難。 這也是 新的 option 法則的設計理念之一。 也就是每一個 option 就對應編譯目錄中的一個 .h 檔案。 這樣的話,Makefile 中的檔案相依的技術 (depend) 就可以派上用場。 make 也可以在 option 改變之後, 很容易的知道某個檔案需不需要重新編譯。

舊的選項機制仍然對於局部的設定或是短時間實驗性的設定有幫助: 加一個新的 #ifdef 到 kernel 程式碼中是比較容易, 這實已加了新的 kernel 選項了。 使用這樣的程式的人必需自己確認一切都是正確的 (或許要手動強迫系統從新編譯 kernel)。 在所有的選項都轉換到新的形態之後, config(8) 在發現設定檔中有舊的設定時會提出警告,但仍會將該設定寫進 kernel 的 Makefile 裡。