cygwinでのcross開発環境

私にしかわからないメモです。(しかももう情報古くなってそう)
wxWindowsはdiffつくったけど…foxの方が楽だ。

開発環境を構築する(1999/11/04)

必要なもの:
gcc-2.95.2(各GNUサイト)
ftp://sourceware.cygnus.com/pub/cygwin/latest/dev-src.tar.bz2
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95.2/gcc-2.95.2-mingw-extra.tar.gz
# cd /usr/src
# mkdir cygwin
# cd cygwin
# mkdir cygwin-dev
# cd cygwin-dev
# tar xvaf dev-src.tar.bz2
# mkdir cross
# cd cross
# ../src/configure --prefix=/usr/local/i686-pc-cygwin32 --target=i686-pc-cygwin32
# make 2>&1 | tee make.log
# make install 2>&1 | tee install.log
# cd ../..
# tar xvzf ~ftp/pub/GNU/gcc/gcc-2.95.2.tar.gz
# find -name \*.rej | xargs rm
# mkdir cross
# ../configure --prefix=/usr/local/i686-pc-cygwin32 --target=i686-pc-cygwin32 \
               --enable-languages="c,c++"
# PATH=$PATH:/usr/local/i686-pc-cygwin32/bin
# make 2>&1 | tee make.log
# make install 2>&1 | tee install.log
# i686-pc-cygwin32-gcc -v
Reading specs from /usr/local/i686-pc-cygwin32/lib/gcc-lib/i686-pc-cygwin32/2.95.2/specs
gcc version 2.95.2 19991024 (release)
# cd /usr/local/i686-pc-cygwin32
# mkdir i686-pc-mingw32
# cd i686-pc-mingw32
# tar xvzf /some/where/gcc-2.95.2-mingw-extra.tar.gz

wxWindowsをcompileする


# mkdir wxmsw
# cd wxmsw
# unzip /some/where/wx200msw.zip
# unzip /some/where/wx200gen.zip
(replace All)
# perl -pi.old -e 's/\r?\n/\n/' \
  include/wx/*.h include/wx/*.cpp include/wx/msw/*.h \
  include/wx/msw/gnuwin32/*.h src/msw/*.cpp src/png/*.[ch] \
  src/xpm/*.[ch] src/zlib/*.[ch] src/common/* src/generic/*.cpp
src/makeg95.env のgcc→i686-pc-cygwin32、ranlib→i686-pc-cygwin32-ranlib
src/makefile.g95のar→i686-pc-cygwin32-ar
src/makeprog.g95のWXDIR = $(WXWIN)をcomment out
include/wx/msw/private.hの__GNUWIN32__の時のCASTWNDPROCを変更
#ifdef __GNUWIN32__
/* #  define CASTWNDPROC (long unsigned) */
       typedef long (* WndProcCast) (HWND, unsigned int, unsigned int, long);
#      define CASTWNDPROC (WndProcCast)
#else

src/msw/utils.cpp: 627 "\\"の前に(char *)と書いてcast
FIXME: とりあえず、MoveEventまわりとcomment out
% cd src/msw
% make -f makefile.g95
% cd ../../samples/minimal
% make -f makefile.g95

wxWindowsを-mno-cygwinでcompileする(1999/11/06)


compile時に-mno-cygwinがつくようにして、compile開始。
こけたソースの__GNUWIN32__を__CYGWIN32__にする。
compile時に-I/usr/local/i686-pc-cygwin32/i686-pc-mingw32/include
link時に-L/usr/local/i686-pc-cygwin32/i686-pc-mingw32/lib がつくようにする。
src/msw をrecompile。samples/minimal をcompileしてみる。
うまくいったらVMware上で実行してみておわり。

dllを作る


% dllwrap --export-all --output-def foo.def --target=i386-mingw32 \
  --implib libfoo.a --as=i686-pc-cygwin32-as --driver-flags="-mno-cygwin -mdll" \
  --driver-name=i686-pc-cygwin32-gcc \
  -o foo.dll a.o b.o dllinit.o

foxをcompileする


OpenGLを使うための用意。
ftp://ftp.microsoft.com/softlib/MSLFILES/OPENGL95.EXE を落してきてVMware上で実行、展開。
*.hを/usr/local/i686-pc-cygwin32/i686-pc-cygwin32/include/GL/というdirectoryを作って格納。
# cd fox
# ./configure
# cd utils
# make
(reswrapを作っておく)
# cd ..
# env CC="i686-pc-cygwin32-gcc -mno-cygwin" CXX="i686-pc-cygwin32-g++ -mno-cygwin" CXXLD="i686-pc-cygwin32-g++ -mno-cygwin" AR=i686-pc-cygwin32-ar RANLIB=i686-pc-cygwin32-ranlib ./configure --with-mingw32=/usr/local/i686-pc-cygwin32/i686-pc-mingw32 --host=i686-pc-cygwin32 --target=i686-pc-cygwin32
(ここでgltest, glviewerをcompileするためにちょっとしたhackをする)
# make
tests/以下の*.exeであそぶ。ちゃんとOpenGLもうごく。
# cd src
# dllwrap --export-all --output-def fox.dll --target=i386-mingw32 --implib libfox.a --as=i686-pc-cygwin32-as --driver-flags="-mno-cygwin -mdll" --driver-name=i686-pc-cygwin32-gcc -o fox.dll *.o -lopengl32 -lglu32 -lgdi32 -lstdc++
(fox.dllができあがる)
# cd ../tests
# cp ../src/fox.dll .
# /bin/sh ../libtool --mode=link i686-pc-cygwin32-g++ -mno-cygwin \
 -DHAVE_OPENGL -Wall -W -Wmissing-prototypes -Woverloaded-virtual  -mwindows \
 -e _mainCRTStartup -o hello.exe  hello.o -lm \
 -L/usr/local/i686-pc-cygwin32/i686-pc-mingw32/lib -L/data2/src/cygwin32/fox/src -lfox
(hello.exeやhello2.exeは動くが動かないものがおおい……)

(C)Copyright 1999 by Sian <sian@big.or.jp>
Last modified: Thu Feb 26 23:02:52 JST 2004