だいたいこんな感じでできる
$ KCFLAGS=<Cコンパイラ用追加オプション> KCPPFLAGS=<プリプロセッサ用追加オプション> KAFLAGS=<アセンブラ用追加オプション> <ビルドコマンド(makeとか)>
以下経緯。
エレコムのUSB3.0カードリーダ MR3-C004がxubuntu 13で認識されなかったのでドライバをビルドしてインストールしてみた。
VirtualBox上では "Realtek USB3.0 Card Reader" と表示されるので以下からLinux用のドライバをダウンロード。2つあるけどどっちかわからんし(もっと言うとどっちも違うかもしれんが)調べるのもめんどいので両方入れてみる。
README.txtの言うとおりmakeしたら怒られた。
CC [M] rts5229/rtsx.c:914:22: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rtsx_probe’
rts5229/rtsx.c:1069:23: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rtsx_remove’
rts5229/rtsx.c:1094:11: エラー: ‘rtsx_probe’ がここでは宣言されていません (関数内ではない)
rts5229/rtsx.c:1095:2: エラー: 関数 ‘__devexit_p’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
rts5229/rtsx.c:1095:24: エラー: ‘rtsx_remove’ がここでは宣言されていません (関数内ではない)
/
rtsx.cの914行目を見ると __devinit が解釈できなくて困っているらしい。Linuxカーネル3.8でVMWare Playerを使う によるとこのマクロと __devexit, __devexit_p は3.8で削除されたらしい。
Makefileを読むと /lib/modules/$(shell uname -r)/build/Makefile に処理を引き渡しているので、コマンドラインでオプションを追加できる余地がないか "FLAG" で検索してみると KCFLAGS という変数に追加したいものをセットしておけばよいらしい。
以下を実行して再起動したら無事ドライバのインストールが完了しカードリーダが認識された。
$ make KCFLAGS="-D__devinit= -D__devexit= -D__devexit_p="
$ sudo make install
$ sudo depmod
そのほかいろいろな設定のための環境変数はKBuildのドキュメントに書いてある。