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]
[はっかーずぱらだいす]
感想とかを投げてみる