Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Gauche の Windows 上でのコンパイル手順 メモ (古い)

Gauche の Windows 上でのコンパイル手順 メモ (古い)

  • 自分がコンパイルしたとき(2015年5月~2018年7月)の参考用のメモです。
    (情報が古くなっている可能性があります)
    Windows 8.1 (64bit) で作業しました。

  • 以下の記述は、MinGW (32bit) の開発環境でのコンパイル手順となっています。
    今では、より新しい MSYS2/MinGW-w64 (64bit/32bit) の開発環境でもコンパイル可能になっています。
    MSYS2/MinGW-w64 (64bit/32bit) の開発環境を使う場合には、以下のページの方を参照ください。
    https://gist.github.com/Hamayama/6666e5d2c8d5167d22f7
    (2016-1-14)


  • <<<現在 MinGW (32bit) の開発環境では、そのままでは、コンパイルできないようです(2016-8-7)(2016-12-19)(2018-2-18)>>>

    調査メモ
      (1)./DIST gen の find コマンドでエラー停止 ( *~ が見つかりません )
         → Windows にも find コマンドがあり、そちらを起動していた。。。
            以下のようにPATH設定を前に付けて実行することで回避できる。
              PATH=/usr/bin:$PATH ./DIST gen
      (2)pkg-config のインストールが必要
         → MinGW Installation Manager には存在しない。
            ソースからインストールするのは、循環参照があり難しいらしい。
            バイナリをダウンロードするのがよさそうだが、以下のページはリンク切れ。
            http://www.gtk.org/download/win32.php
            以下のページにインストール方法があるもよう。
            https://stackoverflow.com/questions/1710922/how-to-install-pkg-config-in-windows#22363820
      (3)configure の PKG_CHECK_MODULES で syntax error が出る
         → pkg.m4 を取得して aclocal --print で表示されるフォルダにコピーする必要がある。
            pkg.m4 の取得については、以下のページが参考になりそう。
            http://blog.k-tai-douga.com/article/52368303.html
            https://pkg-config.freedesktop.org/releases/
      (4)tlsのテストに失敗する(2016-12-19)
         → MinGW 付属の openssl が v1.0.0 と古く、TLS v1.1 に未対応のため。
         → テスト時にバージョンをチェックして、テストをスキップするようになった。
      (5)GC の configure で syntax-error が出る(2018-2-18)
         → 対策 : gc/configure.ac で「comment out the following 3 lines」と
            書かれている行の次の行から3行分を「#」でコメントアウトする。
            (変更後は DIST からやり直しが必要。。。)
      (6)axTLS の crypto_misc.c のコンパイルで、NTE_BAD_KEYSET が未定義というエラーが出る(2018-2-18)
         → 対策 : ext/tls/axTLS/crypto/crypto_misc.c で「#include "gauche.h"」という行の
            次の行に「#include <winerror.h>」という行を挿入する。
    

  1. Gaucheのインストール
    事前に Gauche がインストールされている必要があります。
    以下のページに Windows用バイナリインストーラ があるので、インストールを実施ください。
    http://practical-scheme.net/gauche/download-j.html
    (すでにインストール済みであれば本手順は不要です)

    <<<コンパイルに使う Gauche のバージョンについて(2015-7-3)(2016-12-19)>>>
    開発最新版の Gauche をコンパイルするには、動作する Gauche が必要になります。
    このコンパイルに使用する Gauche は、基本的に最新リリース版であることが想定されている
    とのことです。
    このため、最新リリース版 (現時点では v0.9.6) の Gauche のフォルダを丸ごととっておいて、
    コンパイル時だけは、環境変数PATHを書き換えてそちらを指すようにするのが 安全なようです。

  2. MinGW (32bit) のインストール
    事前に MinGW (32bit) がインストールされている必要があります。
    以下のページを参考に、インストールを実施ください。
    https://gist.github.com/Hamayama/362f2eb14ae26d971ca4
    (すでにインストール済みであれば本手順は不要です)

  3. Gaucheのソースのダウンロード
    GaucheのGitHubのページ
    https://github.com/shirok/Gauche
    から、Download Zip ボタン等で開発最新版のソースをダウンロードします。
    そして適当な作業用フォルダ( c:\work 等)に展開します。
    (注意) 作業用フォルダのパスには、空白を入れないようにしてください。

  4. Gaucheのファイルの修正

    <<<Gaucheの開発最新版では、この修正はもう不要です(2015-5-24)>>>

    • そのままコンパイルすると、MinGW (32bit) に MemoryBarrier 関数が存在しないため、
      エラーが発生します(Gauche v0.9.5_pre1 で確認)。
      参考URL:
      https://bugs.freedesktop.org/show_bug.cgi?id=41423
      ( MemoryBarrier not available on mingw (from mingw.org) and people keep working around it )
      とりあえずの対策としては、src/gauche/wthread.h に以下の修正を行うと、コンパイル可能になります。
      --- wthread_orig.h	2015-04-28 15:00:33 +0900
      +++ wthread.h	2015-04-28 22:30:53 +0900
      @@ -142,6 +142,8 @@
       #define SCM_INTERNAL_FASTLOCK_DESTROY(fl) SCM_INTERNAL_MUTEX_DESTROY(fl)
       
       /* Issues a full memory barrier */
      -#define SCM_INTERNAL_SYNC()                 MemoryBarrier()
      +#define SCM_INTERNAL_SYNC() \
      +    long dummy = 0;         \
      +    InterlockedExchange(&dummy, 1);
       
       #endif /* GAUCHE_WTHREAD_H */
      
      (上記は diff -u コマンドによる差分データです)

  5. MinGW (32bit) のファイルの修正

    <<<Gaucheの開発最新版では、この修正はもう不要です(2015-5-24)>>>

    • 2014-12-29 にリリースされた MinGW ランタイム v3.21 を使うと、
      コンパイル時に timespec 構造体と nanosleep 関数の重複定義エラーが発生します。
      これらは、もともと Gauche が自前 (win-compat.h, system.c の中) で持っていたものが、
      MinGW ランタイム (libmingwex.a) にも追加されたために、重複することになったものです。
      しかし、現状の MinGW ランタイム の timespec と nanosleep の実装には問題があるようです。
      参考URL:
      http://mingw-users.1079350.n2.nabble.com/Definition-of-struct-timespec-in-MinGW-runtime-3-21-td7583272.html
      ( Definition of struct timespec in MinGW runtime 3.21 )
      とりあえずの対策としては、c:\MinGW\include\unistd.h に以下の修正を行うと、コンパイル可能になります。
      (GaucheではなくMinGW側を修正)

      --- unistd_orig.h	2014-12-28 23:28:33 +0900
      +++ unistd.h	2015-04-29 00:33:11 +0900
      @@ -90,12 +90,15 @@
        * with period values normally distributed around means of ~27.5 ms
        * and ~7.5 ms, for the two system types respectively.
        */
      +#if 0
       #define _FAKE_TIME_H_SOURCED	1
       #define __need_struct_timespec	1
       #include <parts/time.h>
      +#endif
       
       _BEGIN_C_DECLS
       
      +#if 0
       /* The nanosleep() function provides the most general purpose API for
        * process/thread suspension; it provides for specification of periods
        * ranging from ~7.5 ms mean, (on WinNT derivatives; ~27.5 ms on Win9x),
      @@ -114,6 +117,7 @@
           ? (unsigned)(-1) : (unsigned)(period->tv_nsec));
       }
       #endif
      +#endif
       
       /* The usleep() function, and its associated useconds_t type specifier
        * were made obsolete in POSIX.1-2008; declared here, only for backward
      

      (上記は diff -u コマンドによる差分データです)

      (その後、MinGW ランタイム の timespec と nanosleep の実装の問題は、
      MinGW ランタイム v3.21.1 で修正されたもよう。
      ただし、MinGW Installation Maneger では v3.21.1 はまだ配信されていない。(2015-10-10)
      現在、MinGW Installation Maneger で配信されているようです。(2016-4-16))

  6. Gaucheのファイルの修正2

    <<<Gaucheの開発最新版では、この修正はもう不要です(2015-12-23)>>>

    • トップフォルダの configure.ac で autoconf の v2.69 以上を要求していますが、
      現状の MinGW (32bit) では autoconf が v2.68 であるため、以下のエラーが発生します。
      (Gauche v0.9.5_pre1 で確認)

      configure.ac:2: error: Autoconf version 2.69 or higher is required
      configure.ac:2: the top level
      autom4te-2.68: /bin/m4 failed with exit status: 63
      

      とりあえずの対策としては、configure.ac の AC_PREREQ([2.69]) という行を、
      AC_PREREQ([2.68]) に修正すれば、このエラーは発生しなくなります(2015-10-10)。
      (ただし warning は表示されます)


  7. Gaucheのファイルの修正3

    <<<Gaucheの開発最新版では、この修正はもう不要です(2015-12-18)>>>

    • out-of-tree build (別フォルダにオブジェクトファイル等を生成すること) の対応により?、
      tls のテストが失敗します。
      (Gauche v0.9.5_pre1 で確認)
      とりあえずの対策としては、ext/tls/Makefile.in に以下の修正を行うと、
      tls のテストが成功するようになります(2015-11-16)(2015-11-17修正)。
      --- Makefile_orig.in	2015-11-13 17:41:56 +0900
      +++ Makefile.in	2015-11-17 12:35:40 +0900
      @@ -49,7 +49,22 @@
       
       # abs_srcdir is used to refer to the $(srcdir) from subdirectories;
       # needed for SSLTEST_GENERATED
      -abs_srcdir = `case '$(srcdir)' in /*) ;; *) pwd;; esac`/$(srcdir)
      +#abs_srcdir = `case '$(srcdir)' in /*) ;; *) pwd;; esac`/$(srcdir)
      +abs_srcdir =             \
      +`case @host@ in          \
      +   *-mingw*)             \
      +     old_path='\`pwd\`'; \
      +     cd '$(srcdir)';     \
      +     pwd -W;             \
      +     cd '$(old_path)'    \
      +     ;;                  \
      +   *)                    \
      +     old_path='\`pwd\`'; \
      +     cd '$(srcdir)';     \
      +     pwd;                \
      +     cd '$(old_path)'    \
      +     ;;                  \
      +esac`
       
       @GAUCHE_TLS_SWITCH_AXTLS_TEST@EXTRA_TEST_BIN = $(SSLTEST)
       
      @@ -84,7 +99,7 @@
       	echo "int safe_system(const char*);" > $(SSLTEST_GENERATED)
       	sed -e "s@\.\./ssl/@$(abs_srcdir)/axTLS/ssl/@g" \
       	    -e "s/system/safe_system/g" \
      -	    -e "s@openssl @$(abs_srcdir)/kick_openssl @g" \
      +	    -e "s@openssl @sh $(abs_srcdir)/kick_openssl @g" \
       	    $(srcdir)/axTLS/ssl/test/ssltest.c >> $(SSLTEST_GENERATED)
       	cat $(srcdir)/system-fix.c >> $(SSLTEST_GENERATED)
       
      
      (上記は diff -u コマンドによる差分データです)

  8. Gaucheのコンパイル
    コマンドプロンプトを開いて以下を実行します。
    ( c:\work にソースを展開した場合)

    bash
    cd /c/work/Gauche
    PATH=/usr/bin:$PATH ./DIST gen
    src/mingw-dist.sh
    

  9. テストの実行
    コマンドプロンプトを開いて以下を実行します。
    ( c:\work にソースを展開した場合)

    bash
    cd /c/work/Gauche
    make check
    

    結果は、
    Total: 19340 tests, 19340 passed, 0 failed, 0 aborted.
    のように表示されます。
    結果をファイルにも残したい場合は、上記の3行目を、

    make check 2>&1 | tee test_result.txt
    

    のように変更します。
    ( c:\work\Gauche に test_result.txt というファイルが作られます)

  10. 生成したファイルのコピー
    生成した
    c:\work\Gauche-mingw-dist\Gauche-unknown
    の中身を、すべて、
    c:\Program Files\Gauche
    (もしくは c:\Program Files (x86)\Gauche )
    に上書きコピーします。
    (念のため上書き前のフォルダのバックアップを取ってから作業してください)

  11. バージョンの確認
    コマンドプロンプトを開いて以下を実行し、バージョンを確認します。

    gosh -V  
    

(2015-5-8)(2015-5-24)(2015-7-3)(2015-10-10)(2015-11-16)
(2015-11-17)(2015-12-9)(2015-12-18)(2015-12-23)(2015-12-24)
(2016-1-14)(2016-4-17)(2016-7-13)(2016-8-7)(2016-9-7)
(2016-12-19)(2018-2-18)(2018-7-8)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment