vine-users ML アーカイブ



[vine-users:080470] Re: corega FEtherII CB TXD につ いて

  • From: KATO Masashi <mkato@xxxxxxxxxxxxx>
  • Subject: [vine-users:080470] Re: corega FEtherII CB TXD につ いて
  • Date: Mon, 23 Aug 2010 02:26:54 +0900
加藤(大阪)です。

超亀レスかつ、肝心な事柄は既に解決済みのようですが。

Fri, 13 Aug 2010 01:43:38 +0900 付
0707 fukaさんのメールより引用:

> ①http://corega.jp/product/os/vine215.txtの中のcorega FEtherII CB TXDの使用時のポイント4に
> 
> # gcc -MD -c -O2 -I/usr/src/linux/pcmcia-cs-3.1.12/include \
>   -D__KERNEL__ -DEXPORT_SYMTAB -DMODVERSIONS \
>   -include /usr/src/linux/include/linux/modversions.h \
>  -DMODULE -DCARDBUS rtl8139.c -o realtek_cb.o
> とありますが、-D__KERNEL__ -DEXPORT_SYMTAB -DMODVERSIONS \-include
> /usr/src/linux/include/linux/modversions.h \-DMODULE -DCARDBUS
> という意味を教えて戴きたいです。

この箇所だけに反応します。

まず、それぞれの行末の '\' ですが、これは、この行がここで終わりではな
く、次の行に続く事を意味します。
つまり上の例では "gcc" から "realtek_cb.o" までが一行のコマンドラインで
有る事を意味しています。なので、X-端末などに打ち込む時は、'\' は省いて、
続け様に打ち込むか、'\' の後ろで [Enter] を打ち、次の行を続けて打ち続け
る事になります。(これは既にご存知かも知れませんが、一応。)

次に、'-include /usr/src/linux/include/linux/modversions.h' の部分です
が、これは指定ヘッダファイル "modversions.h" をコンパイル対象に "別途"
で含める事 (include)を意味します。
("別途" と書いたのは、既にソースファイル (ここでは rtl8139.c) の中でも
'#include <hoge.h>' などとして、"別途ではなく" 含めるファイルを指定して
いる事があるからです)

あとの '-D__KERNEL__'、'-DCARDBUS'、など頭に '-D' が付くものは、それぞれ
'-D' の後ろの文字列('__KERNEL__' や 'CARDBUS' など)をソースの外で定義
('D'efine)しています。
これらの文字列の定義は、コンパイル時にソースの中に '#ifdef __KERNEL__'
や '#ifndef __KERNEL__' などという部分が見つかった時、その部分を選択的に
コンパイルしたりしなかったりするように制御する(条件付きコンパイルといい
ます)時に使います。
つまり、コマンドラインから '-D__KERNEL__' を "省略" した場合は、ソース内
で
    #ifdef __KERNEL__ 
    ...(ソースコード)
    #endif
と書かれてるような箇所は、'...(ソースコード)' の部分はコンパイルの対象か
ら外されることになります。
(#ifndef とある時は、その逆になります。また、省略しなかった場合は、どち
らも真逆に働きます)

なお、これらのオプションは、順番に処理されていき、ソースやヘッダファイル
内で定義解除 (#undef) される事も有り得るので、コマンドライン内での順番は
入れ替えない方が望ましいです。

'-include' と '-D' についての詳細は、
  $ man gcc
などで調べる事が出来ます。

また、gcc に、'-E' オプションを付けて実行すると、コンパイル前の "前処理"
だけを行った結果を出力してくれるので、

$ gcc -E source.c > pp1
$ gcc -E -include header.h -DDEBUG source.c > pp2
    (※ここでのソース名、ヘッダファイル、定義文字列は仮のものです)

などとした場合の、pp1 と pp2 の違いを diff コマンドなどで、

$ diff -suNr pp1 pp2

差分を取ると、実際に '-include' や '-D' を付けるのと付けない場合の違いが
確認出来ます (これはその他の前処理オプションでも応用出来ます)。

以上、蛇足レスで申し訳ないですが、この部分へのレスが無かったようなので。

-- 
加藤 雅 <mkato@xxxxxxxxxxxxx>
	http://add10.hp.infoseek.co.jp/rox/
	http://www2.odn.ne.jp/add10/fluxbox/
_______________________________________________
vine-users mailing list
vine-users@xxxxxxxxxxxxxxxxxxxx
http://listserv.linux.or.jp/mailman/listinfo/vine-users