djgpp/building_watt32_on_msys2

djgpp/building_watt32_on_msys2

Watt-32のdjgpp用ライブラリなどをWindowsのmsys2内でビルドしてみるための自分用メモ

必要なもの

msys2とdjgppのクロス開発環境
djgpp/building_on_msys2をてきとうに参照
Watt-32
基本的にはソースを自分でビルドしてライブラリ(libwatt.a)を作る必要がある。
公式サイトからリンクされているgithubのリポジトリは https://github.com/gvanem/Watt-32/ みたいですよ…

libwattの(クロス)ビルド

src ディレクトリの下にあるconfigur.batconfigur.shを実行してターゲット固有の各種ファイル(Makefile、dep、djgppの場合はエラーコード用のヘッダ)を作り、makeを行う(make -f djgpp.mak)という流れになる。

各種ファイルの作成は基本的に util ディレクトリ下にあるホスト向けのバイナリファイルで行う。 32bit DOS、Linux (x86_64)、Win32向けのコンパイル済バイナリがアーカイブやgithubリポジトリに用意されている。

git cloneしたときは、util以下のDOS用とWin32用exeファイルの実行権限が解除されているので、改めてexeファイルに実行権限を付与するか、mingwのgccでリコンパイルする必要がある。 (自分はutil/win32以下のexeをmsys版でないWin32版zipでアーカイブ→exe全削除→アーカイブ展開、みたいな雑な手段で対応してしまった。git config core.filemode falseしておかないとめんどくさい)

んだけど、configur.shのほうだと微妙に必要なファイル作ってくれてない気がする…

configur.batのdjgpp対応部分

:djgpp
::
echo Generating DJGPP makefile, directory, errnos and dependencies
%MKMAKE% -o djgpp.mak -d build\djgpp makefile.all DJGPP FLAT
%MKDEP%  -s.o -p$(OBJDIR)/ *.c *.h   > build\djgpp\watt32.dep
echo neterr.c: build\djgpp/syserr.c >> build\djgpp\watt32.dep

%DJ_ERR% -s > build\djgpp\syserr.c
%DJ_ERR% -e > ..\inc\sys\djgpp.err

echo Run GNU make to make target:
echo   make -f djgpp.mak
goto next

で、configur.shのdjgpp対応部分

gen_djgpp ()
{
  echo "Generating DJGPP makefile, directory, errnos and dependencies"
  ../util/linux/mkmake -o djgpp.mak -d build/djgpp makefile.all  DJGPP
  ../util/linux/mkdep -s.o -p\$\(OBJDIR\)/ *.[ch] > build/djgpp/watt32.dep

  echo "neterr.c: build/djgpp/syserr.c" >> build/djgpp/watt32.dep
  #
  # these hacks won't work because errnos.c relies on being compiled as a target-exe.
  # echo "#include <errno.h>" | $DJGPP_PREFIX-gcc -E -dD - | grep "#define E" > ../util/generrno.h
  # echo "#include <sys/version.h>" | $DJGPP_PREFIX-gcc -E -dD - | grep "#define __DJGPP" >> ../util/generrno.h
  # make -C ../util -f errnox.mak dj_err
  # ../util/dj_err -s > build/djgpp/syserr.c
  # ../util/dj_err -e > ../inc/sys/djgpp.err
  #
  echo "Run GNU make to make target:"
  echo "  'make -f djgpp.mak'"
}

なんかめんどくさいので、configurのdjgpp部分をてきとうに切り出して、makefileっぽい何かを作ってみた。

djgpp_msys.mak:
DJ_PREFIX ?= /djgpp/bin/i586-pc-msdosdjgpp-
W32_BIN2C_ ?= ../util/win32/bin2c.exe
W32_NASM_ ?= ../util/win32/nasm.exe
PKT_STUB ?= pkt_stub.h

-include djgpp.mak

nomakefile:
	@echo "djgpp.mak not exist."
	@echo "make -f djgpp_msys.mak makefile"

makefile:
	echo "Generating DJGPP makefile, directory, errnos and dependencies"
	../util/win32/mkmake -o djgpp_debug.mak -d build/djgpp makefile.all  DJGPP DEBUG
	../util/win32/mkmake -o djgpp.mak -d build/djgpp makefile.all  DJGPP RELEASE
	../util/win32/mkdep -s.o -p\$$\(OBJDIR\)/ *.[ch] > build/djgpp/watt32.dep
	../util/win32/dj_err -s > build/djgpp/syserr.c
	../util/win32/dj_err -e > ../inc/sys/djgpp.err
	@echo "neterr.c: build/djgpp/syserr.c" >> build/djgpp/watt32.dep

make -f djgpp_msys.mak makefileでdjgpp.makその他を作ってから、make -f djgpp_msys.makでライブラリをビルドする感じです…。