齊藤 (2010/03/09 22:42:32 PST)
Mingw 版 Gauche を pthread 対応にする手順についての記述です。
msys + mingw の環境は用意できている前提とします。
まず必要な作業は pthread ライブラリの導入です。 Windows 自体は pthread 互換層を提供していません。 以下のサイトから POSIX Threads for Win32 をダウンードして下さい。
http://sourceforge.net/projects/mingw/files/
必要なファイルはlibpthread-2.8.0-3-mingw32-dll-2.tar.lzma と pthreads-w32-2.8.0-3-mingw32-dev.tar.lzma のふたつですので適切にインストールして下さい。
次に Gauche のソースコードを取得します。
% svn co https://gauche.svn.sourceforge.net/svnroot/gauche/Gauche/trunk Gauche (中略) Checked out revision 7075.
取得したソースコードに以下のパッチをあてます。
Index: src/Makefile.in
===================================================================
--- src/Makefile.in (revision 7075)
+++ src/Makefile.in (working copy)
@@ -188,7 +188,7 @@
$(LINK) $(gosh_LDFLAGS) -o gosh$(EXEEXT) $(gosh_OBJECTS) $(gosh_LDADD) $(LIBS)
relink :
- $(RELINK) $(libgauche_LDFLAGS) $(LIBGAUCHE).$(SOEXT) $(libgauche_OBJECTS) ../gc/.libs/*.o $(LIBS)
+ $(RELINK) $(libgauche_LDFLAGS) $(LIBGAUCHE).$(SOEXT) $(libgauche_OBJECTS) ../gc/.libs/*.a $(LIBS)
$(RELINK) $(gosh_LDFLAGS) -o gosh$(EXEEXT) $(gosh_OBJECTS) $(gosh_LDADD) $(LIBS)
$(OBJECTS) : $(HEADERS)
@@ -228,7 +228,7 @@
paths.$(OBJEXT) : getdir_win.c getdir_dummy.c getdir_darwin.c
$(LIBGAUCHE).$(SOEXT) : $(libgauche_OBJECTS) $(GCLIB)
- $(LINK) $(libgauche_LDFLAGS) $(LIBGAUCHE).$(SOEXT) $(libgauche_OBJECTS) ../gc/.libs/*.o $(LIBS)
+ $(LINK) $(libgauche_LDFLAGS) $(LIBGAUCHE).$(SOEXT) $(libgauche_OBJECTS) ../gc/.libs/*.a $(LIBS)
$(POSTBUILD)
gauche-config$(EXEEXT) : gauche-config.$(OBJEXT)
@@ -299,7 +299,7 @@
objlib.c compile.c autoloads.c builtin-syms.c \
gauche/builtin-syms.h vminsn.c gauche/vminsn.h \
../lib/gauche/vm/insn.scm
-CONFIG_GENERATED = Makefile genconfig makeverslink gauche/config.h
+CONFIG_GENERATED = Makefile genconfig makeverslink config.h gauche/config.h
clean :
rm -rf core core.[0-9]* gosh$(EXEEXT) gauche-config$(EXEEXT) \
Index: src/mingw-dist.sh
===================================================================
--- src/mingw-dist.sh (revision 7075)
+++ src/mingw-dist.sh (working copy)
@@ -10,8 +10,8 @@
# make sure we're going to use Mingw gcc
case `gcc --version` in
*mingw*) ;;
- *) echo "Set PATH to have MinGW bin directory first"
- exit 1;;
+# *) echo "Set PATH to have MinGW bin directory first"
+# exit 1;;
esac
# build
Index: src/system.c
===================================================================
--- src/system.c (revision 7075)
+++ src/system.c (working copy)
@@ -123,6 +123,26 @@
#endif /* defined(MSVC) && defined(UNICODE) */
/*===============================================================
+ * Windows specific - fakes for pthread.
+ */
+#if defined(GAUCHE_WINDOWS) && defined(GC_WIN32_PTHREADS)
+int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset) {
+ switch (how) {
+ case SIG_BLOCK:
+ case SIG_UNBLOCK:
+ case SIG_SETMASK:
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ errno = ENOSYS;
+ return -1;
+}
+#endif /* defined(GAUCHE_WINDOWS) && defined(GC_WIN32_PTHREADS) */
+
+/*===============================================================
* OBSOLETED: Wrapper to the system call to handle signals.
* Use SCM_SYSCALL_{I|P} macro instead.
*/
Index: src/gauche/pthread.h
===================================================================
--- src/gauche/pthread.h (revision 7075)
+++ src/gauche/pthread.h (working copy)
@@ -42,8 +42,13 @@
/* Thread */
typedef pthread_t ScmInternalThread;
+#ifdef __MINGW32__
+#define SCM_INTERNAL_THREAD_INIT(thr) ((thr) = (pthread_t){.p=NULL, .x=0})
+#define SCM_INTERNAL_THREAD_INITIALIZED_P(thr) ((thr.x) != 0)
+#else
#define SCM_INTERNAL_THREAD_INIT(thr) ((thr) = (pthread_t)NULL)
#define SCM_INTERNAL_THREAD_INITIALIZED_P(thr) ((thr) != (pthread_t)NULL)
+#endif
/* Mutex */
typedef pthread_mutex_t ScmInternalMutex;
Index: src/gauche/config.h.in
===================================================================
--- src/gauche/config.h.in (revision 7075)
+++ src/gauche/config.h.in (working copy)
@@ -61,6 +61,9 @@
/* Define to use Win32 threads */
#undef GC_WIN32_THREADS
+/* Define to use Win32 pthreads */
+#undef GC_WIN32_PTHREADS
+
/* Define number of args gethostbyaddr_r takes */
#undef GETHOSTBYADDR_R_NUMARGS
Index: configure.ac
===================================================================
--- configure.ac (revision 7075)
+++ configure.ac (working copy)
@@ -2,7 +2,7 @@
AC_PREREQ(2.54)
AC_INIT(Gauche, 0.9.1_pre1, shiro@acm.org)
AC_CANONICAL_SYSTEM
-AC_CONFIG_HEADER(src/gauche/config.h ext/auxsys/auxsysconf.h)
+AC_CONFIG_HEADER(src/config.h src/gauche/config.h ext/auxsys/auxsysconf.h)
# ABI_VERSION is set to major.minor of Gauche version by default.
# It can be overridden by uncommenting the following line.
@@ -192,6 +192,12 @@
THREADLIBS="-lpthread"
GAUCHE_THREAD_TYPE=pthreads
;;
+ *-*-mingw*)
+ AC_DEFINE(GC_WIN32_PTHREADS,1,[Define to use Win32 pthreads])
+ THREADLIBS="-lpthread"
+ CFLAGS="$CFLAGS -mthreads"
+ GAUCHE_THREAD_TYPE=pthreads
+ ;;
*-*-darwin*)
AC_DEFINE(GC_DARWIN_THREADS,1,[Define to use Darwin threads])
AC_DEFINE(GC_PTHREADS,1,[Define to use pthreads])
Index: gc/configure.ac
===================================================================
--- gc/configure.ac (revision 7075)
+++ gc/configure.ac (working copy)
@@ -177,6 +177,12 @@
THREADDLLIBS=""
win32_threads=true
;;
+ *-*-mingw*)
+ AC_DEFINE(GC_WIN32_PTHREADS)
+ AC_DEFINE(THREAD_LOCAL_ALLOC)
+ THREADDLLIBS="-lpthread"
+ win32_threads=true
+ ;;
*-*-darwin*)
AC_DEFINE(GC_DARWIN_THREADS)
AC_DEFINE(THREAD_LOCAL_ALLOC)
@@ -381,6 +387,9 @@
alpha-*-openbsd*)
enable_shared=no
;;
+ *-*-mingw*)
+ enable_shared=no
+ ;;
*)
;;
esac
その後は通常の手順でビルドするだけです。
% cd Gauche % ./DIST gen % ./configure --prefix=/gauche --enable-threads=pthreads % make % make install