openwatcom-v2、DragonFlyBSD, NetBSDにおいてはFreeBSDと同等な感じになるよう対応してみたのですが、自分が一番使いたいOpenBSDへの対応は、まだです。bld/watcom/c/clibext.cの_cmdname()が厄介で、
- FreeBSD
- もともと#if defined(__BSD__)とBSD系汎用になっていたが、sysctl()のKERN_PROC_PATHNAMEはFreeBSD, DragonFlyBSDしか対応しない。しかし共通化はせず後述の理由によりFreeBSD専用に。procfsをマウントした場合は/proc/curproc/fileのみが現在実行中のファイルに対するシンボリックリンクになる。
- DragonFlyBSD
- FreeBSDと同様のsysctl()を持つものの、bld/wmake/posmakeの-D_POSIX_C_SOURCE=200112Lにより__BSD_VISIBLEが無効化されるため#include <sys/types.h>を追加したところでsysctl()に必要なu_intが定義できない→UNIX汎用の処理に委ねることに。/proc/self/exe, /proc/curproc/file, /proc/curproc/exe全てに現在実行中のファイルへのリンクが張られる。
- NetBSD
- /proc/self/exe, /proc/curproc/exeには現在実行中のファイルへのリンクが張られるが、/proc/curproc/fileは現在実行中のファイルそのものとなる。UNIX汎用の処理で対応できるが、悪影響が出ないように修正が必要。
という訳で、この三つの環境における_cmdname()の実装はどうにかなっています。問題はOpenBSD。現在実行中のファイルの所在、それもフルパスで得る方法はおそらく無いです。argv[0]で得るにも限度がありますし、__prognameやgetprogname()はプログラム名単体になってしまいます。chromiumでも同様の問題に当たっているようで、決め打ち/環境変数でどうにかするしかなさそうな感じです。
ビルドシステム(?)で使用する、build.sh, setvars.shをまだちゃんと理解していないので、この辺りをきちっと見てからどういうコードを書くか考える必要がありそうです。なにしろ、setvars.shのOWTOOLS, OWDOSBOXを設定してbuild.sh動かせば良いんだよね程度の認識しかなくて…55.5kg(23:25)