S-JIS[2013-01-07]

Cygwin向けCutter

CutterCygwinで使う方法。


インストール

Cygwinへのインストール方法はCutter本家のCygwinへインストールで分かりやすく説明されている。

  1. Cygwinのインストーラーを起動し、以下のパッケージをインストールする。
    パッケージ
    Devel gcc4
    Devel gdb
    GNOME libglib2.0-devel
    Devel gettext-devel
    Devel intltool
    Devel libiconv
    Devel libtool
    Devel make
    Devel pkg-config
  2. Cutterのダウンロードサイトからアーカイブファイル(cutter-1.2.1.zip)をダウンロードする。
  3. アーカイブを適当な場所に展開する。(cutter-1.2.1というディレクトリーが出来る)
  4. Cygwin(bash)を起動し、展開した場所へ移動して設定コマンドを実行する。
    $ cd cutter-1.2.1
    $ ./configure
  5. コンパイルコマンドを実行する。
    $ make
  6. インストールコマンドを実行する。
    $ make install
  7. コマンドの確認。
    $ which cutter
    $ cutter
    $ pkg-config --cflags cutter

CygwinでCutterを試しに使ってみる為の最小限のサンプル。

examle.c(テスト対象のソース):

int add(int n, int m)
{
	return n + m;
}

test_example.c(テストを実行するCutterのソース):

#include <cutter.h>

extern int add(int n, int m);

void test_add(void)
{
	cut_assert_equal_int(3, add(1, 2)); //add(1, 2)の結果が3であることを確認する
}

テスト対象のソースは、何の変哲も無い普通のC言語のソース。

テスト実行用のソースでは、cutter.hをインクルードする。
テストを実行する関数は、関数名を「test_」で始める。
実行結果の判定には「cut_」で始まる関数(マクロ)が色々用意されているので、それを使用する。
→Cutterリファレンスマニュアルの検証

(テスト実行用の関数は自動的に収集される為、テスト用のmain関数を自分で作ったりする必要は無い)

コンパイル

テスト対象のソースは普通にコンパイルする。
テスト実行用ソースもコンパイルは普通にするが、cutter.hの場所を指定する必要がある。
これらのオブジェクトをまとめて、最終的にdllファイルを作成する。(gccオプションの-sharedを指定する)
テストを実行する際は、このdllファイルが読み込まれる。

$ gcc -c example.c -o example.o
$ gcc -c test_example.c -o test_example.o $(pkg-config --cflags cutter)
$ gcc -shared example.o test_example.o -o test_example.dll $(pkg-config --libs cutter)
$ ls
example.c  example.o  test_example.c  test_example.dll  test_example.o

pkg-configは、ヘッダーファイルやライブラリーの場所やファイル名を(コンパイラーの引数に使える形式で)教えてくれるコマンド。
OSによってはヘッダーファイル等が置かれる場所が異なる為、直接指定せずにpkg-configを利用する。

$ pkg-config --cflags cutter
-I/usr/local/include/cutter
$ pkg-config --libs cutter
-L/usr/local/lib -lcutter

テストの実行

$ cutter .
.

Finished in 0.001553 seconds (total: 0.000116 seconds)

1 test(s), 1 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s)
100% passed

テストはcutterコマンドで実行する。
cutterの引数には、dllファイルの置いてあるディレクトリーを指定する。(今回はカレントディレクトリーを指定)
すると自動的にdllファイルが読み込まれ、その中にある「test_」で始まっている関数が全て実行される。
テストが全て通れば結果が緑色で表示され、1つでも失敗すると赤で表示される。


MinGW用(挫折中)

MinGWはCygwinのサブセットで、MinGW用にコンパイルするとCygwinのDLLを使わない実行ファイルが作れるらしい。
が、gcc3まではコンパイルオプションに「-mno-cygwin」を付ければMinGW用になったらしいが、Cutterはgcc4なので、そのオプションが使えない。

$ gcc -c example.c -o example.o -mno-cygwin
gcc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler.

MinGW用コンパイラーの使用

gcc4の場合は、MinGW用のコンパイラーとしてgccの代わりに「x86_64-w64-mingw32-gcc」を使えばいいらしい。
これは、Cygwinのインストーラーで「Devel/mingw64-x86_64-gcc-core」を入れれば使える。

参考: wltさんのCygwinでcygwin1.dllフリーなWindows実行ファイルを作る (MinGW-w64)

が、cutter.hを含んだコンパイルを行うとエラーになる…。

$ x86_64-w64-mingw32-gcc -c test_example.c -o test_example.o $(pkg-config --cflags cutter)
In file included from /usr/local/include/cutter/cutter/cut-assertions-helper.h:23:0,
                 from /usr/local/include/cutter/cutter/cut-assertions.h:23,
                 from /usr/local/include/cutter/cutter.h:26,
                 from test_example.c:1:
/usr/local/include/cutter/cutter/cut-public.h:43:28: fatal error: sys/socket.h: No such file or directory
コンパイルが中断されました。

sys/socket.hは「/usr/include」にあるので、それを加えてみても…

$ x86_64-w64-mingw32-gcc -c test_example.c -o test_example.o $(pkg-config --cflags cutter) -I/usr/include
In file included from /usr/local/include/cutter/cutter/cut-public.h:33:0,
                 from /usr/local/include/cutter/cutter/cut-assertions-helper.h:23,
                 from /usr/local/include/cutter/cutter/cut-assertions.h:23,
                 from /usr/local/include/cutter/cutter.h:26,
                 from test_example.c:1:
/usr/include/inttypes.h:262:10: 警告: conflicting types for built-in function ‘imaxabs’
In file included from /usr/include/sys/socket.h:16:0,
                 from /usr/local/include/cutter/cutter/cut-public.h:43,
                 from /usr/local/include/cutter/cutter/cut-assertions-helper.h:23,
                 from /usr/local/include/cutter/cutter/cut-assertions.h:23,
                 from /usr/local/include/cutter/cutter.h:26,
                 from test_example.c:1:
/usr/include/cygwin/socket.h:57:3: error: expected specifier-qualifier-list before ‘__uid32_t’

なおさら意味不明なことにorz

cut-public.hの43行目を見てみると、

#ifndef CUT_DISABLE_SOCKET_SUPPORT
#  ifdef CUT_HAVE_WINSOCK2_H
#    include <winsock2.h>
#    include <ws2tcpip.h>
#  else
#    include <sys/socket.h>		←43行目
#    ifdef CUT_HAVE_SYS_UN_H
#      include <sys/un.h>
#    endif
#  endif
#endif

#ifndefがあるので、CUT_DISABLE_SOCKET_SUPPORTを定義してみる。

$ x86_64-w64-mingw32-gcc -c test_example.c -o test_example.o $(pkg-config --cflags cutter) -DCUT_DISABLE_SOCKET_SUPPORT

すると、ちゃんと通った!

しかし、最後のリンクでまたエラー。

$ x86_64-w64-mingw32-gcc -shared example.o test_example.o -o test_example.dll $(pkg-config --libs cutter)
/usr/lib/gcc/x86_64-w64-mingw32/4.5.3/../../../../x86_64-w64-mingw32/bin/ld: 互換性のないを /usr/local/lib/libcutter.dll.a スキップしました (-lcutter を探索している時)
/usr/lib/gcc/x86_64-w64-mingw32/4.5.3/../../../../x86_64-w64-mingw32/bin/ld: 互換性のないを /usr/local/lib/libcutter.dll.a スキップしました (-lcutter を探索している時)
/usr/lib/gcc/x86_64-w64-mingw32/4.5.3/../../../../x86_64-w64-mingw32/bin/ld: -lcutter が見つかりません
collect2: ld はステータス 1 で終了しました

Cutterのライブラリーに互換性が無いらしい。(make時にはgcc4でコンパイルしていたから?)


再インストール

コンパイラーをx86_64-w64-mingw32-gccに変えて再コンパイルしてみる。

$ cd /cutter-1.2.1
$ ./configure CC=x86_64-w64-mingw32-gccchecking for GLIB - version >= 2.12.3... no
*** Could not run GLIB test program, checking why...
*** The test program failed to compile or link. See the file config.log for the
*** exact error that occured. This usually means GLIB is incorrectly installed.
configure: error: GLib >= 2.12.3 required.

glibのバージョンは新しいはずなんだけどなぁ(gcc4のときは通ったんだし)。
「--disable-glibtest」を付けるとglibのバージョンチェックはスキップできるのだが。

$ ./configure CC=x86_64-w64-mingw32-gcc --disable-glibtest
$ make
〜
make[3]: ディレクトリ `/tmp/cutter-1.2.1/gcutter' に入ります
  CC     gcut-marshalers.lo
  CC     gcut-assertions-helper.lo
In file included from /usr/include/glib-2.0/gio/gio.h:47:0,
                 from ../gcutter/gcut-process.h:469,
                 from gcut-assertions-helper.h:35,
                 from gcut-assertions-helper.c:32:
/usr/include/glib-2.0/gio/gcredentials.h:67:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'g_credentials_get_unix_user'
/usr/include/glib-2.0/gio/gcredentials.h:70:52: error: expected declaration specifiers or '...' before 'uid_t'
gcut-assertions-helper.c: In function 'gcut_assert_equal_int64_helper':
…

分かんねー><


Cutterへ戻る / C言語目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま