autoconfぼくらの約束

$Id: promise.html,v 1.8 1997/09/16 05:04:19 itojun Exp $
#ifdef __FreeBSD__みたいなのは使わない。
#ifdef __FreeBSD__を書いて「移植性が高いぜ」とか いばってるのはもう恥ずかしい。
未知のOSでも動くように、autoconfで調べて#ifdef HAVE_HOGE しましょう。 どうしてもしかたないときは、configure.inの中で AC_CANONICAL_HOST()して$host_osを調べる。
POSIXも悪くない
こころがけてPOSIX関数を使うと、「最近の」OSでの移植性はあがります。 例えば、FreeBSD上で作業していて、SGI IRIX/Sun Solaris/HPUX/ whateverでも動かしたい場合にはいいと思います。
そのかわり... NEWS-OS 4.2とかに移植するときに苦労するかも...
bcopyはやめてmemcpy
いっこ上と同じですが。
BSD由来のbcopyとかbzeroとかを使うと、あとで 比較的苦労します。 memcpyとかmemsetにしましょう。 で、もしどうしても必要なら
#define memcpy(x, y, z) bcopy(y, x, z)
する (当然、memcpyの有無はconfigure.inで調べる)。
ファイル単位の切り分けを上手に
OSごとにすごくAPIが違うもの、例えばbpf/nitとかについては、 自分でwrapperっぽい関数をつくって上へのインタフェースを統一し、 wrapper部分をファイル単位で切り分けると美しい。 ファイル単位の切替えはLIBOBJSとかのmake変数を 使えばすぐできます。
ぼくのプログラム			ぼくのプログラム
----------------my api			----------------my api
wrapper for OS1				wrapper for OS2
================OS1 api			================
   OS1 kernel				   OS2 kernel

OBJS=nantara.o $(LIBOBJS)		OBJS=nantara.o $(LIBOBJS)
LIBOBJS=api-os1.o			LIBOBJS=api-os2.o
見本にしてほしいのはlibpcapの 切り分けですね (おいらだってできゃしないけどさ)。
追加募集中

[itojun] [はっかーずぱらだいす]
感想とかを投げてみる