$ export RC_ARCHS=ppc程度の環境変数を設定しておけば、手でもできるが、せっかくの GUI なので ProjectBuilderWO を使ってやった。使い方はほとんど説明をするまでもなく、make のターゲットを指定し、build ボタンを押すだけである。
$ export RC_CFLAGS='-arch ppc'
$ export RC_OS='Darwin'
$ export SRCROOT=`pwd`
$ export TARGETS=ppc
$ export HOSTS=ppc
$ export MAKEFILEPATH=/Developer/Makefiles
# tar -zxvf Libcomapt-14-1-bin.tar.gz -C /で、/usr/locall/lib/system 以下に libcompat.a を入れておく。
# tar -zxvf Libstreams-21-1-bin.tar.gz -C /で、./System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/ 以下に streams/*.h を、また、/usr/locall/lib/system 以下に libstreams.a を入れておく。
# tar -zxvf Csu-35-bin.tar.gz -C /で入れておく。ただし、この際、cctools に含まれる indr が必要だったのでちょっと手間取った。
# tar -zxvf Libc-149-bin.tar.gz -C /で、/usr/local/lib/system/libc.a もインストールされるが、実は libc の内容は、/System/Library/Frameworks/System.framework/Versions/Current/System に含まれており、これが自動的にリンクされるようである。
$ cctools-6-1/libdyld/てな感じ。
$ make dlopen.o
$ libtool -static -o libdl.a dlopen.o
# tar -zxvf libdl-cctools-6-1-bin.tar.gz -C /で、/usr/local/include/ に dlfcn.h が、また、/usr/local/lib/system/ に libdl.a と libdyld.a がインストールされる。
一応、非常に簡単ではあるが、テストプログラムを作ってテストしておく。
$ cat main.cと、一応動いているようである。Daynamically Loadable Module を作るには -bundle を使うこと。
#include <dlfcn.h>
#include <stdio.h>
int main() {
void *handle;
void (*hw)(void);
void (*hh)(void);printf("Loading \"libhello.dylib\" .....\n");
handle = dlopen("/Users/fujiik/sandbox/mypkg/src/libdl/test/libhello.dylib",RTLD_LAZY);hw = dlsym(handle,"_helloworld");
(*hw)();
hh = dlsym(handle,"_hellohoge");
(*hh)();dlclose(handle);
return 0;
}$ cat hw.c
#include <stdio.h>
void helloworld() {
printf("Hello World\n");
}
$ cat hh.c
#include <stdio.h>
void hellohoge() {
printf("Hello Hoge\n");
}$ cat Makefile
CC = cc
CFLAGS = -O2 -fPIC
DYLIBFLAGS = -bundle -undefined suppress
LDFLAGS = -L/usr/local/lib/system -ldl -ldyldPROGRAM = hello
DYLIBNAME = libhello.dylib
DYLIBOBJS = hh.o hw.oall: $(PROGRAM)
$(DYLIBNAME): $(DYLIBOBJS)
$(CC) $(DYLIBFLAGS) -o $@ $(DYLIBOBJS)$(PROGRAM): main.c $(DYLIBNAME)
$(CC) main.c -o $@ $(LDFLAGS)clean:
$(RM) *.o *.dylib *~ $(PROGRAM)$ make
cc -O2 -fPIC -c -o hh.o hh.c
cc -O2 -fPIC -c -o hw.o hw.c
cc -bundle -undefined suppress -o libhello.dylib hh.o hw.o
cc main.c -o hello -L/usr/local/lib/system -ldl -ldyld
$ ./hello
Loading "libhello.dylib" .....
Hello World
Hello Hoge
今までにコンパイルしたもののソースおよびパッチは macosx/src
に、またバイナリーの tar ball は macosx/tgz
または macosx/darwin.tgz
にそれぞれ置いてある。いつものように使う場合は自己責任で。