2008-02-29

GSL ライブラリを利用したコンパイル

SourceForge.net Logo
GSL (GNU Scientific Library) は、科学技術計算用 C ライブラリです。このライブラリは C 用にスクラッチから(一から)書き起こされ、API (Application Programming Interface)の形式でライブラリの各関数を利用できるようになっています。GSL のソースコードは GPL に従って配布されます。

今回は、MinGW クロスコンパイル用に公開している GSL ライブラリを使ったコンパイル例の紹介と、注意点(問題点)に関するメモです。今回使用するサンプルは、以下の通り。


/******************************************************************************
* grand.c
* GNU Scientific Library (GSL) 用サンプルプログラム
*
* 分布関数に従う乱数
*
* ヘッダーファイル(GSL)
* - Random Number Distributions(乱数分布)用
* gsl/gsl_randist.h
*
* 使用する主要関数
* double gsl_ran_gaussian (const gsl_rng * r, double sigma)
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_statistics.h>

#define DATA_NUM 10000

int
main (void)
{
int i, n = DATA_NUM;
double sigma = 1.0, data[DATA_NUM];
gsl_rng *r;

/* 乱数生成のためのインスタンス(ジェネレータ)生成 */
r = gsl_rng_alloc (gsl_rng_default);

/* システムクロックを使って乱数の初期値を設定 */
gsl_rng_set (r, time (NULL));

for (i = 0; i < n; i++)
{
/* ガウス分布(正規分布)に従う平均 0、標準偏差 sigma の乱数 */
data[i] = gsl_ran_gaussian (r, sigma);

if (i % 10 == 0)
printf ("\n");
printf ("%7.3f", data[i]);
}

/* 検証用の統計値出力 */
printf ("\n\nRandom Numbers in Normal Distribution, N(%.2f, %.2f)\n",
0.0, sigma);
printf ("Size : %d, ", n);
printf ("Mean : %8.5f, ", gsl_stats_mean (data, 1, n));
printf ("STD : %8.5f\n", gsl_stats_sd (data, 1, n));

return EXIT_SUCCESS;
}
/* grand.c */

これを Linux 上でクロスコンパイルすると、なにやら警告メッセージが出てきます。

$ i386-mingw32-gcc -Wall grand.c -lgsl -lgslcblas -o grand.exe
Info: resolving _gsl_rng_default by linking to __imp__gsl_rng_default (
auto-import)
/usr/local/lib/gcc/i386-mingw32/4.2.1-sjlj/../../../../i386-mingw32/bi
n/ld: warning: auto-importing has been activated without --enable-auto-
import specified on the command line.
This should work unless it involves constant data structures referencin
g symbols from auto-imported DLLs.

grand.exe はコンパイルされ、ちゃんと実行できますが、毎回こんなメッセージが出るのは煩わしいことです。このメッセージは、--enable-auto-import オプションをリンク時に指定せよということなので、コンパイル時にオプションを指定してコンパイルしてみます。

$ i386-mingw32-gcc -Wall grand.c -lgsl -lgslcblas -o grand.exe -Wl,--en
able-auto-import

$

たしかに、警告メッセージが出なくなります。しかし、このオプションって、MinGW のリンカではデフォルトで有効になっていたような…。リンカの問題なのか GSL のビルドに問題があるのか調べる必要がありそうです。

ちなみに、このプログラムの WINE 環境での実行結果は次のようになります。

$ pwd
/home/bitwalk/work/gsl
$ cd /usr/local/i386-mingw32/bin
$ /home/bitwalk/work/gsl/grand.exe

-0.389 -0.794 -1.418 0.717 1.348 -0.249 -1.727 0.153 -0.510 0.212
0.122 -1.673 0.060 0.162 0.509 0.303 0.883 -1.841 -1.260 0.515
1.595 0.109 0.869 -0.099 -0.055 1.756 -0.480 -0.431 0.389 1.816

(途中省略)

1.161 -0.384 1.051 -0.341 -1.550 -0.194 1.344 -1.377 -1.127 -1.453
1.458 0.081 0.443 0.137 -0.177 0.641 0.329 -0.501 0.352 -1.382

Random Numbers in Normal Distribution, N(0.00, 1.00)
Size : 10000, Mean : -0.00621, STD : 0.99311
$

MinGW クロスコンパイル環境でコンパイルしたライブラリも増えてきたので、そろそろ DLL だけを集めたランタイムパッケージを用意した方が便利そうです。

スタティックライブラリの利用


Windows 上にビルドしたバイナリを移して実行する際、必要な DLL も同じディレクトリに持ってくるのが面倒な場合、スタティックライブラリを利用する方法もあります。通常のコンパイルで、共有ライブラリ (DLL) とスタティックライブラリの両方が利用できる場合、共有ライブラリにリンクされますが、-static オプションを付けることで、リンク時にスタティックライブラリの内容を取り込みます。

スタティックライブラリへリンクすると、バイナリ単体のファイルサイズは、DLL にリンクした場合より大きくなります。しかし、スタティックライブラリとリンクした場合は、必要なオブジェクトファイルのみをバイナリに取り込みますので、通常は、共有ライブラリとリンクしたバイナリ単体と DLL のファイルサイズ合計よりは小さくなります。

同一のライブラリを利用するアプリケーションが多数ある場合、DLL を使えば、ディスク領域を効率的に利用できますが、そうでない場合は、スタティックライブラリを利用した方が効率的な時があります。ビルドするアプリケーションの用途に応じてどちらを利用するか検討する価値はあります。

今回のサンプルで、スタティックライブラリをリンクしてビルドする例を示します。


$ i386-mingw32-gcc -static -Wall grand.c -lgsl -lgslcblas -o grand.e
xe

$ ./grand.exe

-2.488 -0.085 -1.947 -0.206 0.571 1.248 0.211 -0.357 -0.646 -0.023
0.643 -0.707 2.632 1.010 -0.915 -0.894 -0.083 0.303 -0.736 1.284
1.934 -0.477 -0.856 -1.235 -0.380 -0.032 0.076 0.678 -1.175 0.508

(以下省略)

この場合、WINE 環境でも、パスを気にせずバイナリの動作を検証できます。

参考文献


[1] GNU Scientific Library -- Reference Manual
 

2008-02-26

C による Tcl/Tk 拡張 : カスタマイズした wish (3)

SourceForge.net Logo
回は、Tcl における expr コマンドで利用できる関数を追加した拡張 wish, bwish を作ります。追加する関数は、サンプルとして立方根を計算する cbrt という C の関数を利用します。もし、お使いの Linux で最新の gcc(正確に言えば、glibc)の開発環境でない場合は念のため man cbrt でマニュアルが表示されるかどうか確認してください。利用できない場合は、適当に他の利用可能な関数に置き換えてください。MinGW クロスコンパイラの方は C99 に準拠していますので、cbrt を利用できます。

プログラム


プログラムのソースは、kwish をビルドした時と同じような構成をとります。すなわち bwish_main.cbwish_sub.c および bwish.h です。

今回のプログラムでは、前回 kwish をビルドするときに利用した API、Tk_MainLoop を利用せず、代わりに Tk_Main を使いました。どのやり方が正しい、ということではありませんが、wish あるいは tclsh を拡張して、イベントループを扱うプログラムを作成する際には、Tk_Main あるいは Tcl_Main を利用する方法がポピュラーだと思います。

/* bwish_main.c */
#include "bwish.h"

/* type of math value definition */
Tcl_ValueType ArgDouble[] = { TCL_DOUBLE };

/*
* Tk_Main acts as the main program for most Tk-based applications.
* Starting with Tk 4.0 it is not called main anymore because it is part of
* the Tk library and having a function main in a library (particularly
* a shared library) causes problems on many systems. Having main in the Tk
* library would also make it hard to use Tk in C++ programs, since C++
* programs must have special C++ main functions.
*
* Normally each application contains a small main function that does nothing
* but invoke Tk_Main. Tk_Main then does all the work of creating and running
* a wish-like application.
*/

int
main (int argc, char *argv[])
{
Tk_Main (argc, argv, AppInit);
return EXIT_SUCCESS;
}

/*
* This procedure provides a “hook” for the application to perform its own
* initialization, such as defining application-specific commands.
* The procedure must have an interface that matches the type Tcl_AppInitProc:
*
* typedef int Tcl_AppInitProc(Tcl_Interp *interp);
*/

int
AppInit (Tcl_Interp * interp)
{
if (Tcl_Init (interp) == TCL_ERROR)
return TCL_ERROR;

if (Tk_Init (interp) == TCL_ERROR)
return TCL_ERROR;

/* Define application-specific commands and math functions here */
Tcl_CreateMathFunc (interp, "cbrt", 1, ArgDouble, func_cbrt,
(ClientData) NULL);

return TCL_OK;
}

/* bwish_main.c */

コメントに記載してある内容は Tcl/Tk のマニュアルからそのまま写しただけです。要は main 関数では Tk_Main を実行してイベントループ状態にするだけで、Tcl/Tk のカスタマイズに関わる処理は AppInit 関数に記述するようにします。

今回のサンプルで Tcl に追加する立方根の算術関数は、cbrt という名前で、その処理は、func_cbrt 関数が担います。この算術関数 cbrt では倍精度実数の引数がひとつ必要なので、Tcl_Value 型で TCL_DOUBLE を一つ持つ配列をあらかじめ定義しておきます。もし倍精度実数の引数が2つ必要な場合には、例えば次のようにします。

Tcl_ValueType ArgDouble2[] = { TCL_DOUBLE, TCL_DOUBLE };

なお、TCL_DOUBLE の他に TCL_INT, TCL_WIDE_INT あるいは TCL_EITHER を指定できます。

立方根の計算処理部である func_cbrt 関数は bwish_sub.c に記述しました。立方根の計算に関わる引数と計算結果は、インタープリタ interp に対しポインタでやりとりをします。func_cbrt 関数は int 型で、計算の成否を TCL_OK (= 0) あるいは TCL_ERROR (= 1) で返すだけです。

/* bwish_sub.c */
#include "bwish.h"

/*****************************************************************************
* int func_cbrt
* 拡張数学関数 3√x(立方根)の処理部
*
* Tcl 側のコマンド
* expr cbrt($n)
*****************************************************************************/

int
func_cbrt (ClientData clientData, Tcl_Interp * interp,
Tcl_Value * args, Tcl_Value * resultPtr)
{
double x;

x = args->doubleValue;

/* 計算結果 */
resultPtr->type = TCL_DOUBLE;
resultPtr->doubleValue = cbrt (x);

return TCL_OK;
}

/* bwish_sub.c */

インクルードファイル bwish.h には、このプログラムで使用するインクルードファイルやプロトタイプ関数宣言をまとめました。

/* bwish.h */
#if !defined(BWISH_H)
#define BWISH_H

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <tcl.h>
#include <tk.h>

/* prototype functions */
extern int AppInit (Tcl_Interp *);
extern int func_cbrt (ClientData, Tcl_Interp *, Tcl_Value *, Tcl_Value *);

#endif /* BWISH_H */
/* bwish.h */

Windows 用のビルドでは、アイコンをリソースとして用意しました。リソーススクリプト bwish.rc は、Tcl/Tk のソースファイルにある win/tclsh.rc などをベースにしています。なおブログの表示の関係で、80文字を越える行は80文字で改行しています。

// bwish.rc
// RCS: @(#) $Id: bwish.rc,v 1.2 2008/02/25 10:48:08 bitwalk Exp bitwalk $
//
// Version Resource Script
//


#include <winver.h>
#include <tcl.h>

//
// build-up the name suffix that defines the type of build this is.
//

#if TCL_THREADS
#define SUFFIX_THREADS "t"
#else
#define SUFFIX_THREADS ""
#endif

#if STATIC_BUILD
#define SUFFIX_STATIC "s"
#else
#define SUFFIX_STATIC ""
#endif

#if DEBUG && !UNCHECKED
#define SUFFIX_DEBUG "g"
#else
#define SUFFIX_DEBUG ""
#endif

#define SUFFIX SUFFIX_THREADS SUFFIX_STATIC SUFFIX_DEBUG

LANGUAGE 0x9, 0x1 /* LANG_ENGLISH, SUBLANG_DEFAULT */

VS_VERSION_INFO VERSIONINFO
FILEVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEASE
_SERIAL
PRODUCTVERSION TCL_MAJOR_VERSION,TCL_MINOR_VERSION,TCL_RELEASE_LEVEL,TCL_RELEA
SE_SERIAL
FILEFLAGSMASK 0x3fL
#ifdef DEBUG
FILEFLAGS VS_FF_DEBUG
#else
FILEFLAGS 0x0L
#endif
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", "Wish Application\0"
VALUE "OriginalFilename", "bwish" STRINGIFY(TCL_MAJOR_VERSION) STRI
NGIFY(TCL_MINOR_VERSION) SUFFIX ".exe\0"
VALUE "CompanyName", "bitWalk Co., Ltd.\0"
VALUE "FileVersion", TCL_PATCH_LEVEL
VALUE "LegalCopyright", "Copyright \251 2008 by bitWalk Co., Ltd.,
et al\0"
VALUE "ProductName", "bWish " TCL_VERSION " for Windows\0"
VALUE "ProductVersion", TCL_PATCH_LEVEL
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

//
// Icon
//


bwish ICON DISCARDABLE "bwish.ico"

// bwish.rc

適当なアイコンファイル bwish.ico が必要になります。下の関連資料に示した素材サイトなどからダウンロードして適当な ico ファイルを bwish.ico と名前を変えて使うか、アイコン作成ツールで用意してください。

関連資料で紹介した素材サイトは、利用条件が明記されていたので載せました。他の多くのサイトでもアイコン素材が公開されていますので、興味があれば検索してみてください。

最後に、Linux 用と Windows 用クロスコンパイルのメイクファイルを示します。

# Makefile

CC = gcc
RM = rm -f

TARGET = bwish

OBJEXT = o
TARGETEXT =

DEFS =
INCLUDE = -I/usr/include
CFLAGS = -Wall -O2 -std=c99 $(DEFS) $(INCLUDE)
LDFLAGS = -L/usr/lib
TK_LIBS = -ltk -ltcl
LIBS = $(TK_LIBS) -lX11 -lm

OBJS = \
bwish_main.$(OBJEXT) \
bwish_sub.$(OBJEXT)

all: $(TARGET)$(TARGETEXT)

$(TARGET)$(TARGETEXT): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

.SUFFIXES: .$(OBJEXT)
.c.$(OBJEXT):
$(CC) -c $(CFLAGS) $< -o $@

$(OBJS): $(TARGET).h

clean:
$(RM) $(TARGET)$(TARGETEXT) $(OBJS) *~

# Makefile

MinGW クロスコンパイル環境でビルドするためのメイクファイル Makefile.win では、windres でリソースをコンパイルしますが、出力の拡張子は .res.o にしています。
なお、このサンプルでは、拡張した expr コマンドの算術関数の動作を確認するために、敢えて -mconsole スイッチをつけてリンクするようにしています。

# Makefile.win

PREFIX = i386-mingw32-
CC = $(PREFIX)gcc
RC = $(PREFIX)windres
RM = rm -f

TARGET = bwish

OBJEXT = o
TARGETEXT = .exe
RES = res.o
TARGET_RES = bwish.$(RES)

DEFS =
INCLUDE = -I/usr/local/i386-mingw32/include
CFLAGS = -Wall -O2 -std=c99 $(DEFS) $(INCLUDE)
LDFLAGS = -L/usr/local/i386-mingw32/lib
TK_LIBS = -ltk -ltcl
WIN32_LIBS = -lws2_32 -lgdi32 -lcomdlg32 -limm32 \
-lcomctl32 -lshell32 -luuid -lole32 -loleaut32
LDFLAGS_CONSOLE = -mconsole
LDFLAGS_WINDOW = -mwindows
LIBS = $(TK_LIBS) $(WIN32_LIBS) $(LDFLAGS_CONSOLE)

OBJS = \
bwish_main.$(OBJEXT) \
bwish_sub.$(OBJEXT) \
$(TARGET_RES)

all: $(TARGET)$(TARGETEXT)

$(TARGET)$(TARGETEXT): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

.SUFFIXES: .$(OBJEXT)
.SUFFIXES: .$(RES)
.SUFFIXES: .rc

.c.$(OBJEXT):
$(CC) -c $(CFLAGS) $< -o $@

.rc.$(RES):
$(RC) -o $@ $<

$(OBJS): $(TARGET).h

clean:
$(RM) $(TARGET)$(TARGETEXT) $(OBJS) *~

# Makefile.win


ビルドと実行


Linux ではビルドして、bwish を実行すると、wish を実行したときと同様に、トップレベルウィジェットが表示され、コンソール上は % のプロンプトが表示され入力待ちになります。

$ make
gcc -c -Wall -O2 -std=c99 -I/usr/include bwish_main.c -o bwish_main.o
gcc -c -Wall -O2 -std=c99 -I/usr/include bwish_sub.c -o bwish_sub.o
gcc -o bwish bwish_main.o bwish_sub.o -L/usr/lib -ltk -ltcl -lX11 -lm
$ ./bwish
% expr cbrt(27)
3.0
%

Windows 用のクロスコンパイルでは、ビルド後に Tcl/Tk の bin ディレクトリへ bwish.exe をコピーして実行しても、コンソール上にプロンプトが表示されません。仕方がないので、ビルドしたバイナリを Windows へ移して動作確認をしました。コンソールは、コマンドプロンプトのウィンドウが表示されます。

$ make -fMakefile.win clean
rm -f bwish.exe bwish_main.o bwish_sub.o bwish.res.o *~
$ make -fMakefile.win
i386-mingw32-gcc -c -Wall -O2 -std=c99
-I/usr/local/i386-mingw32/include bwish_main.c -o bwish_main.o
i386-mingw32-gcc -c -Wall -O2 -std=c99
-I/usr/local/i386-mingw32/include bwish_sub.c -o bwish_sub.o
i386-mingw32-windres -o bwish.res.o bwish.rc
i386-mingw32-gcc -o bwish.exe bwish_main.o bwish_sub.o bwish.res.o
-L/usr/local/i386-mingw32/lib -ltk -ltcl -lws2_32 -lgdi32 -lcomdlg32 -limm32
-lcomctl32 -lshell32 -luuid -lole32 -loleaut32 -mconsole
$ cp bwish.exe ../mingw-tcltk-8.5.1-2/bin/
$ cd ../mingw-tcltk-8.5.1-2/bin/
$ ./bwish.exe
err:winedevice:ServiceMain driver L"Cdr4_2K" failed to load
err:winedevice:ServiceMain driver L"Cdralw2k" failed to load
fixme:font:WineEngCreateFontInstance Untranslated charset 255
fixme:comm:set_queue_size insize 4096 outsize 4096 unimplemented stub
fixme:imm:ImmReleaseContext (0x10026, 0x158f08): stub



このところ、立て続けにカスタマイズした wish のビルドの方法について説明をしてきましたが、いかがだったでしょうか。Tcl/Tk を拡張してアプリケーションを構築する際、wish や tclsh を直接拡張する方法の他に、拡張パッケージを作成し、標準の wish や tclsh からロードして拡張機能を利用する方法があります。拡張パッケージの作り方については、過去にホームページで掲載していた資料がありますので、それをベースに書き直して、あらためて現在のホームページの方に掲載しようと考えています。

関連情報


Tcl/Tk C Library
[1] Tcl Library
[2] Tk Library

ico ファイル素材&ツール
[1] [素材]Windows XP ファイル用アイコン
[2] @icon変換 - 画像とアイコンの相互変換ツール

C 言語
[1] プログラミング言語 C の新機能
 

2008-02-25

Linux で IE6 を使う

回は Linux における MinGW の クロスコンパイル環境で、バイナリの動作チェックなどに利用している Wine (Wine Is Not Emulator) の話題です。

最近インターネット上で取り上げられた Wine に関するニュース:

WindowsアプリをLinuxで活用できるWine 0.9.51:日本語フォントが追加 (ZDNet Japan)
ついにPhotoshopをサポート - Win32 API互換環境「Wine 0.9.54」 (マイコミジャーナル)
GoogleがLinux上でのPhotoshop動作に資金提供 (スラッシュドット・ジャパン)


個人的には、Wine 上で Photoshop を使うことに強い関心を持っているわけではないのですが、こういった開発の成果として、Wine をより安定して利用できるようになることを期待しています。

Wine-doors


Windows Application Management for the Gnome Desktop というサブタイトルにあるように、Wine で動作するさまざまなアプリケーションをオンラインでインストールしてくれるというスグレ物です。Wine-doors » Downloads から Fedora 用の RPM wine-doors-0.1.2-1.i386.rpm をダウンロードしてファイル依存を解決後にインストールします。
Wine-doors の使用方法は、Wine-doors » Screenshots & Videos を参考にしてください。インストール例がビデオで用意されています。しかもインストールの実時間を丸ごと記録しているので、とても長いビデオです。ただし Fedora でのアプリケーションの起動はコンソール上で、wine-doors とタイプします。

自分のシステムでは(興味がある)アプリケーションのインストールには成功したものの、インストール後にフォントが表示されなくなり、導入を諦めました。おそらくフォントの色がバックグラウンドの色と同じになってしまうことが直接の原因ではないかと思います。

Wine-doors を試す場合、次のようにして、前もって現在の Wine の設定を保存しておくことをお勧めします。

$ mv .wine .wine_old

Wine では、何かの変更やインストールで変になってしまった場合、.wine のディレクトリを削除すれば良いので、比較的簡単にいろいろな事が試せます。逆に言うと、大切なファイルや情報は、.wine 内に保存しないようにしておかなければなりません。

【参考】ちなみに拡張子 .exe が付いたファイルを実行すると、自動的に Wine が起動しますが、その際に .wine のディレクトリが存在していなければ、デフォルトの設定で .wine のディレクトリ以下の内容が作成されます。

Wine-doors は、まだバージョンが低いので、しばらくは様子見ということで、問題なくインストールされたアプリケーションが動作するようになったら再度報告したいと思います。また、日本語環境で Wine-doors を問題なく利用できている方がいらっしゃれば、是非教えてください。

IEs4Linux


Linux 上で Wine を必要とする場面は、MinGW クロスコンパイル環境でビルドしたバイナリの初期動作チェックができ、かつ、Windows 向けインストーラ作成用に利用している Inno Setup を動作させることぐらいなので、とりあえず現状で満足しているのですが、欲を言えば、インターネットエクスプローラ (IE) を利用したいと思っています。そうすれば、Linux 上で Web のレイアウトチェックが IEでできます。もちろん FirefoxOpera は Wine 上で動作するのですが、肝心の IE のインストールは今まで成功していませんでした。

Wine-doors によるインストールがうまくいかなかったので、他に何かないか探したところ、IEs4Linux というサイトを見つけました。マイクロソフトのインターネットエクスプローラ (IE5, 5.5, 6) を Linux/Wine の環境で動作させるようにするプロジェクトで、自分が求めていたもの、そのものズバリのサイトです。Fedora でのインストール方法は、 Installation:Fedora で説明されている通りです。

自分のシステムでは、最初に ./ies4linux を実行すると途中でエラーが出ましたが、再度実行すると、うまくいきました。またデスクトップのショートカットが、~/デスクトップ 内にできずに、~/Desktop 内に生成されましたので、これを ~/デスクトップ 内に移し、ダブルクリックで IE6 を起動出来るようにしました。
使用言語によって、Gnome が使用するディレクトリ名が変更されるのは便利のようですが要注意です。いろいろな事情で、使用する言語設定を何度も変えていることが原因かもしれません。

さて、IE6 on Linux を起動してみた状況ですが、日本語サイトのレイアウトはフォントの関係でいまいちでした。しかし、メニューの ツール(T)Windows Update(U) では、あたかも Windows 上で実行しているかのように動作します。

問題点は、この IE を終了しても、wineserver が終了せず、top コマンドでチェックすると CPU の使用率が 100%(以上)になっていることです。システム・モニターに表示される CPU の使用量が 55% 程度であることから察するに、CPU のコアの片方が wineserver に占有されてしまっているようです(AMD Athlon 64x2 を使用)。そのため、IE を終了したあと(他に、Wine 上で動作しているアプリケーションが無ければ)毎回 kill コマンドで wineserver のプロセスを終了するようにしています。この現象は、Firefox を Wine 上で起動した場合には発生しません。

現在でも IE でしか閲覧できないサイトがあったり、Firefox と微妙にレイアウトが違ってしまうサイトがあるので、多少の不具合があっても、使えるようにしておきたいアプリケーションです。

関連情報


互換レイヤー/エミュレータ
[1] Windows Applications Seamlessly Integrated on your Linux desktop - CrossOver Linux
[2] Windows Applications Seamlessly Integrated on Mac OS X - CrossOver Mac
[3] Cygwin Information and Installation
[4] bochs: The Open Source IA-32 Emulation Project (Home Page)
[5] QEMU

仮想マシン
[1] VMware: Virtualization, Virtual Machine & Virtual Server Consolidation
[2] Citrix XenServer | オンデマンドアクセスのシトリックス
[3] Microsoft Virtual PC 2007 製品情報
 

2008-02-24

C による Tcl/Tk 拡張 : カスタマイズした wish (2)

SourceForge.net Logo

回は、クロスコンパイラ編ということで、MinGW クロスコンパイラ環境で、Win32 用 Tcl/Tk の拡張パッケージをビルドしてみます。

コンパイル環境


コンパイル環境は、以下の通り MinGW Cross Compiler プロジェクトで公開している、コアパッケージと Tcl/Tk のパッケージを使用しています。なお、make は、Linux のものを使います。また、ビルド後に動作を確認するための wine もインストールしておきます。

Fedora 8 (i386)
mingw-binutils-2.18.50-3.fc8
mingw-gcc-core-4.2.1-4.fc8
mingw-runtime-3.14-2.fc8
mingw-w32api-3.11-2.fc8
mingw-tcltk-8.5.1-2.fc8
make-3.81-10.fc8
wine-core-0.9.55-1.fc8 と、依存しているパッケージ群

プログラム


プログラムのソースは、前回使用したものと同じ、kwish_main.ckwish_sub.c および kwish.h です。ビルドに使用するメイクファイルには、以下の Makefile.win を使います。

# Makefile.win

PREFIX = i386-mingw32-
CC = $(PREFIX)gcc
RM = rm -f

TARGET = kwish

OBJEXT = .o
TARGETEXT = .exe

DEFS =
INCLUDE = -I/usr/local/i386-mingw32/include
CFLAGS = -Wall -O2 $(DEFS) $(INCLUDE)
LDFLAGS = -L/usr/local/i386-mingw32/lib
TK_LIBS = -ltk -ltcl
WIN32_LIBS = -lws2_32 -lgdi32 -lcomdlg32 -limm32 \
-lcomctl32 -lshell32 -luuid -lole32 -loleaut32
LDFLAGS_CONSOLE = -mconsole
LDFLAGS_WINDOW = -mwindows
LIBS = $(TK_LIBS) $(WIN32_LIBS) $(LDFLAGS_WINDOW)

OBJS = \
kwish_main$(OBJEXT) \
kwish_sub$(OBJEXT)

all: kwish$(TARGETEXT)

kwish$(TARGETEXT): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

.c.$(OBJEXT):
$(CC) -c $(CFLAGS) $< -o $@

$(OBJS): kwish.h

clean:
$(RM) kwish$(TARGETEXT) $(OBJS) *~

# Makefile.win

リンク時に使用するマクロ WIN32_LIBS にセットしたライブラリのリストは、tk8.5.1 をビルドした時に使用した Makefile のマクロ LIB に記述されているものをそのままコピーしました。

ビルドと実行


Makefile.win を、ソースと同じディレクトリ内に保存し、make コマンドで kwish.exe をビルドします。

$ make -fMakefile.win clean
rm -f kwish.exe kwish_main.o kwish_sub.o *~
$ make -fMakefile.win
i386-mingw32-gcc -Wall -O2 -I/usr/local/i386-mingw32/include
-c -o kwish_main.o kwish_main.c
i386-mingw32-gcc -Wall -O2 -I/usr/local/i386-mingw32/include
-c -o kwish_sub.o kwish_sub.c
i386-mingw32-gcc -o kwish.exe kwish_main.o kwish_sub.o
-L/usr/local/i386-mingw32/lib -ltk -ltcl -lws2_32 -lgdi32 -lcomdlg32
-limm32 -lcomctl32 -lshell32 -luuid -lole32 -loleaut32 -mwindows
$ ./kwish.exe
err:module:import_dll Library tcl85.dll (which is needed by
L"Z:\\home\\bitwalk\\work\\kwish\\kwish.exe") not found
err:module:import_dll Library tk85.dll (which is needed by
L"Z:\\home\\bitwalk\\work\\kwish\\kwish.exe") not found
err:module:LdrInitializeThunk Main exe initialization for
L"Z:\\home\\bitwalk\\work\\kwish\\kwish.exe" failed, status c0000135


Linux 用にビルドした kwish の時と同じようにして kwish.exe を実行しようとしても、Tcl/Tk の DLL が見つからないというエラーメッセージが出て実行できません。念のため objdump で kwish.exe がリンクしている DLL を調べてみましょう。

$ i386-mingw32-objdump -p kwish.exe | grep "DLL Name"
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: tcl85.dll
DLL Name: tk85.dll

実を言うと、この拡張 wish を実行させるためには、tcl85.dlltk85.dll の他に、wish アプリケーションを初期化する Tcl スクリプト init.tcl が必要になります。そのため、仮に Tcl/Tk のスタティックライブラリを利用してビルドして DLL に依存しないようにしても、拡張 wish を単体で動作させることはできません。しかし、とりあえず動作確認をするだけであれば、次のようにして実行させることができます。

$ cd /usr/local/i386-mingw32/bin
$ /home/bitwalk/work/kwish/kwish.exe
fixme:font:WineEngCreateFontInstance Untranslated charset 255
fixme:imm:ImmReleaseContext (0x10026, 0x158190): stub


wine を利用した Windows 版 kwish の実行例

この例では、/home/bitwalk/work/kwish/kwish.exe が、ビルドした拡張 wish です。

MinGW Cross Compiler プロジェクトのサイトでは、RPM パッケージ用にクロスコンパイルした Tcl/Tk のインストールファイルを zip ファイルにしてアップしてありますので、これを利用する方法もあります。[LIB] tcltk から、ここでは mingw-tcltk-8.5.1-2.zip をダウンロードします。

Linux 上では、ダウンロードした zip ファイルを次のように展開します。次に bin ディレクトリ内に、先ほどビルドした kwish.exe をコピーして実行します。

$ unzip mingw-tcltk-8.5.1-2.zip
Archive: mingw-tcltk-8.5.1-2.zip
creating: mingw-tcltk-8.5.1-2/
creating: mingw-tcltk-8.5.1-2/include/
creating: mingw-tcltk-8.5.1-2/bin/
creating: mingw-tcltk-8.5.1-2/lib/
inflating: mingw-tcltk-8.5.1-2/include/tk.h
:
(snip)
:
inflating: mingw-tcltk-8.5.1-2/lib/reg1.2/tclreg12.dll
inflating: mingw-tcltk-8.5.1-2/lib/reg1.2/pkgIndex.tcl
finishing deferred symbolic links:
mingw-tcltk-8.5.1-2/lib/libtk.dll.a -> /usr/local/i386-mingw32/lib/libtk85.a
mingw-tcltk-8.5.1-2/lib/libtcl.dll.a -> /usr/local/i386-mingw32/lib/libtcl85.a
$ cd mingw-tcltk-8.5.1-2/bin
$ cp ~/work/kwish/kwish.exe ./
$ ./kwish.exe
fixme:font:WineEngCreateFontInstance Untranslated charset 255
fixme:comm:set_queue_size insize 4096 outsize 4096 unimplemented stub
fixme:imm:ImmReleaseContext (0x10026, 0x158178): stub

Windows 上でも同様に、ダウンロードした zip ファイルを適当な解凍ツールで展開後、kwish.exebin フォルダ内へ移し、ダブルクリックして起動します。

Windows Vista における Windows 版 kwish の実行例

mingw-tcltk のインストールファイルは、kwish.exe を実行するための最小セットではありません。目的に応じて、不必要なファイルを削除してください。なお、単独のファイルで Tcl/Tk のアプリケーションを実行したい場合には、以下の関連情報を参照してみてください。

関連情報


[1] Starkit deployment technology
[2] freewrap
 

2008-02-23

Tcl/Tk for Windows, build013

SourceForge.net Logo

ロスコンパイル環境で生成した Tcl/Tk 8.5.1 のウィンドウズ用インストールパッケージ (tcltk8.5.1-013-20080223.exe) を MinGW Cross Compiler のプロジェクトサイトにアップロードしました。ダウンロードは以下からどうぞ。

tcltk8.5.1-013

今回、収録したパッケージとビルドした環境は以下の通りです。

Tcl/Tk for Windows, bitWalk build #013
released on 2008-02-23

1. Available version of Tcl/Tk and extensions in this package
- Tcl/Tk 8.5.1
http://sourceforge.net/projects/tcl
- Thread 2.6.5
http://sourceforge.net/projects/tcl
- Tcllib 1.10 (tcllib-20080222)
http://sourceforge.net/projects/tcllib
- BWidget 1.8.0 (bwidget-20071031)
http://sourceforge.net/projects/tcllib
- TkCon 2.5 (tkcon-20080207)
http://sourceforge.net/projects/tkcon

*** unstable
- Incr Tcl/Tk 3.4 (itcl-20080207)
http://sourceforge.net/projects/incrtcl
- Incr Widgets (iwidgets-20070610)
http://sourceforge.net/projects/incrtcl

*** experimental
- TclVfs 1.3 (tclvfs-20080215)
http://sourceforge.net/projects/tclvfs
- Memchan 2.2.1 (memchan-20071113)
http://sourceforge.net/projects/memchan

2. build environment for compiling binaries
- MinGW Cross Compiler on Fedora Linux 8
mingw-binutils-2.18.50-3.fc8
mingw-gcc-core-4.2.1-4.fc8
mingw-runtime-3.14-1.fc8
mingw-w32api-3.11-1.fc8

3. packaging environment
- Inno Setup Compiler 5.2.2
with wine-0.9.55-1.fc8 / Fedora Linux 8
http://www.jrsoftware.org/isinfo.php


今回のリリースは、koji さんから頂いたコメントを契機に、Linux と Windows の両 OS において、Tcl/Tk の拡張パッケージを作成する際に、C でコンパイルする部分の処理の差異を少なくしようとしたことです。と言っても、大した変更ではありません。libtcl.dll.alibtcl85.a のコピー)と libtk.dll.alibtcl85.a のコピー)を追加しただけです。
もちろん、これは Linux 上で Win32 のバイナリをクロスコンパイルする際にも関係します。今回リリースしたパッケージを同じ手順でビルドした Tcl/Tk の RPM パッケージを MinGW Cross Compiler のプロジェクトサイトに追加しました。

[LIB] tcltk

この Tcl/Tk を使って Linux 上でクロスコンパイルした拡張パッケージは、本パッケージと併せて使用できます。

Linux 上でクロスコンパイル環境を用いた Win32 用 Tcl/Tk 拡張パッケージの話題に入る前に、どうしても済ませておきたかったパッケージの更新と追加です。

本インストーラには、その他に Incr Tcl/Tk/Widgets と TclVFS を加えました。ただし Incr Tcl/Tk については、Tcl/Tk 8.5 系に対してテスト不足であるため、unstable としました。また、TclVFS については、本来備わっているべき機能の一部しか実装できていないため、experimental としました。
 

2008-02-22

C による Tcl/Tk 拡張 : カスタマイズした wish (1)


日 koji さんから、Linux 上の MinGW クロスコンパイラ環境を利用した、C による Tcl/Tk 拡張に関するご質問を、コメントとして頂きました【コメント】。いい機会ですので、C による Tcl/Tk の拡張の話題を、クロスコンパイルする話題に絡めて、しばらく取り上げていきたいと思います。
最初の話題として、koji さんがコメント欄に掲載したサンプルをベースに、Linux における Tcl/Tk の拡張例を紹介したいと思います。

koji さんが掲載したサンプルは、Tcl のスクリプトを wish に埋め込んだ wish アプリケーションです。Tcl/Tk では、標準で wish (windowing shell) という Tcl のコマンドシェルが利用できますが、Tcl/Tk の C API を利用して、標準の wish とは別に、カスタマイズした wish を作成できます。
カスタマイズできることは、koji さんが示したサンプルのように、スクリプトを埋め込んで、wish アプリケーションを即起動できるようにしたり、あるいは Tcl のコマンドを追加、あるいは拡張して、標準の wish にない機能を備えた拡張 wish をビルドすることです。

ここでは koji さんのサンプルコードをベースにして、kwish という名前の、スクリプトが埋め込まれた拡張 wish をビルドしてみましょう。

コンパイル環境


コンパイル環境は、以下の通り Fedora 8 に収録されている Tcl/Tk のパッケージを使用しています。なお、一般的な gcc の開発環境が整っていることを前提にしています。

Fedora 8 (i386)
tcl-8.4.17-1.fc8
tcl-devel-8.4.17-1.fc8
tk-8.4.17-2.fc8
tk-devel-8.4.17-2.fc8

プログラム


まず main 関数を含んだソース kwish_main.c を示します。このプログラムは、Tcl/Tk のインタープリタを初期化し、Tcl のスクリプトを処理する関数 app_custom を呼び出したあとに、Tk_MainLoop を実行して GUI のためのイベントループ状態に入ります。

/* kwish_main.c */
#include "kwish.h"

int
main (int argc, char *argv[])
{
Tcl_Interp *interp;

interp = Tcl_CreateInterp ();
Tcl_FindExecutable (argv[0]);

if (Tcl_Init (interp) != TCL_OK)
{
fprintf (stderr, "FATAL: Tcl initialization error: %s\n",
Tcl_GetStringResult (interp));
return EXIT_FAILURE;
}

if (Tk_Init (interp) != TCL_OK)
{
fprintf (stderr, "FATAL: Tk initialization error: %s\n",
Tcl_GetStringResult (interp));
return EXIT_FAILURE;
}

if (app_custom (interp) != TCL_OK)
{
printf ("%s\n", "Program End with script error!");
return EXIT_FAILURE;
}

Tk_MainLoop ();

return EXIT_SUCCESS;
}
/* kwish_main.c */

次の kwish_sub.c では、kwish を起動したときに実行するスクリプトを処理する関数 app_custom を記述しています。koji さんのサンプルでは、定義したスクリプトを UTF-8 にエンコードしています。これはスクリプトに日本語文字など ASCII 以外の文字を含み、かつ、(MS Windows のように)システムのエンコーディングが UTF-8 と異なる場合に役に立ちます。今回使用するスクリプトでは関係がありませんが、そのまま残しました。

/* kwish_sub.c */
#include "kwish.h"

int
app_custom (Tcl_Interp * interp)
{
Tcl_DString ds;
char script[] = "\n\
wm title . {kwish}\n\
label .1lbl -text {Enter your name (and click OK):}\n\
entry .ent2\n\
button .cmd3 -text OK -command ok_clicked\n\
button .cmd4 -text {Exit this program} -command exit\n\
pack .1lbl -anc w\n\
pack .ent2 -fill x\n\
pack .cmd3 -fill x\n\
pack .cmd4 -fill x\n\
proc ok_clicked {} {\n\
tk_messageBox -message \"[.ent2 get], you are here!\"\n\
}\n\
";
char *script_utf = Tcl_ExternalToUtfDString (NULL, script, -1, &ds);

if (Tcl_Eval (interp, script_utf) != TCL_OK)
{
fprintf (stderr, "Error: %s\n", Tcl_GetStringResult (interp));
return TCL_ERROR;
}

Tcl_DStringFree (&ds);

return TCL_OK;
}
/* kwish_sub.c */

インクルードファイル kwish.h には、このプログラムで使用するインクルードファイルやプロトタイプ関数宣言をまとめました。

/* kwish.h */
#if !defined(KWISH_H)
#define KWISH_H

#include <stdio.h>
#include <stdlib.h>
#include <tcl.h>
#include <tk.h>

extern int app_custom (Tcl_Interp *);

#endif /* KWISH_H */
/* kwish.h */

最後に Makefile を示します。リンクでは意図的に、-ltcl -ltk として、Tcl/Tk のバージョンに依存しないようにしました。そのため、tcl-develtk-devel パッケージがビルド時に必要になります。
【注意】本ブログ上では、Makefile におけるコマンド行の先頭部分のタブが表現できないので、コピーして利用する場合はタブ文字に変更してください。

# Makefile

CC = gcc
RM = rm -f

TARGET = kwish

OBJEXT = .o
TARGETEXT =

DEFS =
INCLUDE = -I/usr/include
CFLAGS = -Wall -O2 $(DEFS) $(INCLUDE)
LDFLAGS = -L/usr/lib
TK_LIBS = -ltk -ltcl
LIBS = $(TK_LIBS) -lX11 -lm

OBJS = \
kwish_main$(OBJEXT) \
kwish_sub$(OBJEXT)

all: kwish$(TARGETEXT)

kwish$(TARGETEXT): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

.c.$(OBJEXT):
$(CC) -c $(CFLAGS) $< -o $@

$(OBJS): kwish.h

clean:
$(RM) kwish$(TARGETEXT) $(OBJS) *~

# Makefile

ビルドと実行


以上のソースファイルと Makefile を、同じディレクトリ内に保存し、make コマンドで kwish をビルドします。以下に実行例を示しました。

$ make
gcc -Wall -O2 -I/usr/include -c -o kwish_main.o kwish_main.c
gcc -Wall -O2 -I/usr/include -c -o kwish_sub.o kwish_sub.c
gcc -o kwish kwish_main.o kwish_sub.o -L/usr/lib -ltk -ltcl -lX11 -lm
$ ./kwish


kwish の実行例

このように、簡単に wish にスクリプトを埋め込んだ、拡張 wish をビルドすることができます。次のステップとして、Linux 上の MinGW クロスコンパイル環境下で、同じソースファイルを使って、Winodws 用のバイナリをビルドしてみたいと思います。


wine を利用した Windows 版 kwish の実行例

参考資料


[1] Tcl Library
[2] Tk Library
 

2008-02-19

Visual Studio 2008 Express Editions

ンターネットである情報を探していたら、ひょんなことから Visual Studio 2008 Express Editions のサイトにたどり着き、これは使えそうだと思い、早速オンライン・インストールをしました。

ずっと昔、Visual C++ 6 までは購入して使っていましたが、コンパイラの用途が購入価格に見合わず、結局 Cygwin/MinGW の GCC を利用するようになってしまいました。

Visual Studio 2008 Express Editions の「よくある質問」によると、30日以上使い続けるにはユーザー登録をしなければならないものの、Visual Studio Express Edition を使用して作成したアプリケーションについては、ライセンスの制限がないということです。また、Visual C++ 2008 Express Edition には、MFCATL が含まれていないが、基本的な Optimizing Compiler が含まれているとのことなので、Tcl/Tk などのコンパイルには使えそうです。


そこで、Tcl/Tk 8.5.1 をコンパイルしてみました。
まず、SourceForge.net のサイトから Tcl/Tk8.5.1 のソース(tcl8.5.1-src.tar.gz と tk8.5.1-src.tar.gz、あるいは zip ファイル)をダウンロードしてきて圧縮ファイルを解凍(展開)しておきます。ここでは、E:\mingw\src\ 以下にソースを展開しています。

次に、スタートメニューから、Visual Studio 2008 コマンドプロンプトを起動します。

最初に、Tcl からコンパイルします。インストール先のトップディレクトリを、環境変数 INSTALLDIR にセットしてからビルドします。

Setting environment for using Microsoft Visual Studio 2008 x86 tools.

C:\Program Files\Microsoft Visual Studio 9.0\VC>e:

E:\>cd mingw\src

E:\mingw\src>set INSTALLDIR=e:\mingw\build\Tcl

E:\mingw\src>cd tcl8.5.1\win

E:\mingw\src\tcl8.5.1\win>nmake -fmakefile.vc

Microsoft(R) Program Maintenance Utility Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

===============================================================================
*** Compiler has 'Optimizations'
*** Compiler does not have 'Pentium 0x0f fix'
:
:
:
LINK : warning LNK4224: /OPT:NOWIN98 はサポートされていません。無視されます。
ライブラリ .\Release_VC9\tcldde13.lib とオブジェクト .\Release_VC9\tcldde13.e
xp を作成中
コード生成しています。
コード生成が終了しました。
if exist .\Release_VC9\tcldde13.dll.manifest mt -nologo -manifest .\Rele
ase_VC9\tcldde13.dll.manifest -outputresource:.\Release_VC9\tcldde13.dll;2

E:\mingw\src\tcl8.5.1\win>nmake -fmakefile.vc install

Microsoft(R) Program Maintenance Utility Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

===============================================================================
*** Compiler has 'Optimizations'
*** Compiler does not have 'Pentium 0x0f fix'
:
:
:
Installing package platform::shell 1.1.3 as a Tcl Module
Installing tcldde13.dll
Installing tclreg12.dll
Installing encodings

E:\mingw\src\tcl8.5.1\win>

次に、Tk をビルドします。ビルドの前に、環境変数 TCLDIR へ tcl8.5.1 のソースのトップディレクトリをセットします。インストール先は、この場合は Tcl と同じにしました。つまり、環境変数 INSTALLDIR の値はそのままです。

E:\mingw\src\tcl8.5.1\win>cd ..\..\tk8.5.1\win

E:\mingw\src\tk8.5.1\win>set TCLDIR=e:\mingw\src\tcl8.5.1

E:\mingw\src\tk8.5.1\win>nmake -fmakefile.vc

E:\mingw\src\tk8.5.1\win>nmake -fmakefile.vc install

以上が Tcl/Tk の基本的なビルド手順です。ちなみに、nmake /fnmake -f の両方の形式が可能です。つい癖で -f と入力してしまうのですが、エラーが出なかったので気が付きました。

生成したバイナリについての詳細な評価はまだしていませんが、とりあえず、MinGW クロスコンパイラでビルドした Tcl/Tk のバイナリと、ファイルサイズを比較してみました。

Visual C++ でビルドしたバイナリ



MinGW クロスコンパイラ でビルドしたバイナリ


明らかに、Visual C++ でビルドしたバイナリのサイズの方が小さいことが判ります。詳細なベンチマークを今後やってみたいと考えています。
昔、VC6 と MinGW の gcc で比較したときには、VC6 でコンパイラでビルドしたバイナリの方が、バイナリサイズが小さく、かつ実行速度も速いという結果が出たと記憶していますが、最新の gcc との比較で、どの程度の差が出るか興味があります。

2008-02-07

Tcl/Tk for Windows, build012

SourceForge.net Logo

ロスコンパイル環境で生成した Tcl/Tk 8.5.1 のウィンドウズ用インストールパッケージを MinGW Cross Compiler のプロジェクトサイトにアップロードしました。ダウンロードは以下からどうぞ。

tcltk8.5.1-012

今回、収録したパッケージとビルドした環境は以下の通りです。

Tcl/Tk for Windows, bitWalk build #012
released on 2008-02-06

1. Available version of Tcl/Tk and extensions in this package
- Tcl/Tk 8.5.1
http://sourceforge.net/projects/tcl
- Thread 2.6.5
http://sourceforge.net/projects/tcl
- BWidget 1.8.0 (bwidget-20071031)
http://sourceforge.net/projects/tcllib
- Tcllib 1.10
http://sourceforge.net/projects/tcllib
- TkCon 2.5 (tkcon-20070623)
http://sourceforge.net/projects/tkcon

2. build environment for compiling binaries
- MinGW Cross Compiler on Fedora Linux 8
mingw-binutils-2.18.50-2.fc8
mingw-gcc-core-4.2.1-4.fc8
mingw-runtime-3.14-1.fc8
mingw-w32api-3.11-1.fc8

3. packaging environment
- Inno Setup Compiler 5.2.2
on wine-0.9.54-1.fc8 / Fedora Linux 8
http://www.jrsoftware.org/isinfo.php


Incr Widgets のデモプログラムで、不具合が見つかったため、今回、Incr Tcl/Tk と Incr Widgets を収録しませんでした。そのため、既に以前のバージョンの Tcl/Tk をご利用の場合には、一旦、アンインストールしてから新しいパッケージをインストールしてください。

2008-02-06

Tcl/Tk 8.5.1 リリース


2月5日付けで、Tcl/Tk 8.5.1 がリリースされました。

Date: Tue, 05 Feb 2008 12:21:06 -0500
From: Donald G Porter <dgp at nist.gov>
To: Tcl Core List <tcl-core at lists.sourceforge.net>
Subject: [TCLCORE] Tcl/Tk 8.5.1 RELEASED

Tcl/Tk 8.5.1 Release Announcement
February 5, 2008

The Tcl Core Team is pleased to announce the 8.5.1 releases of the Tcl
dynamic language and the Tk toolkit. This is the first patch release
of Tcl/Tk 8.5. More details can be found below. We would like to
express our gratitude to all those who submit bug reports and patches.
This information is invaluable in enabling us to identify and eliminate
problems in the core.

Where to get the new releases:
------------------------------

Tcl/Tk 8.5.1 sources are freely available as open source from the
Tcl Developer Xchange web site at:

http://www.tcl.tk/software/tcltk/8.5.html

This web page also contains additional information about the releases,
including new features and notes about installing and compiling the
releases. Sources are always available from the Tcl SourceForge
project's file distribution area:

http://sourceforge.net/project/showfiles.php?group_id=10894

Binaries for most major platforms are available from:

http://www.activestate.com/Tcl

For additional information:
---------------------------

Please visit the Tcl Developer Xchange web site:

http://www.tcl.tk/

This site contains a variety of information about Tcl/Tk in general, the
core Tcl and Tk distributions, Tcl development tools, and much more.

Summary of Changes since Tcl/Tk 8.5.0:
--------------------------------------

The following were the main changes in Tcl/Tk 8.5.1. A complete list
can be found in the changes file at the root of the source tree. The
more complete ChangeLog is also included with each source release. This
is a patch release, so it primarily included bug fixes and corrections
to erratic behavior. Below are only the most notable changes.

* Repaired buffer overflow in GIF handling code (CVE-2008-0553).

* Corrected broken regexp engine usage that lost backref support.

* Fixed binary reads from stacked channels.

* Fixed [format %lli 0] and [lreverse {}] crashes.

* Fixed crash in [labelframe -style].

* Fixed crash in a read-only serial channel.

* Corrected memory leak in literals in expressions.

* Revised font size values returned by [font actual]

* Improved [lsort] performance.

* Fixed Tk's Dutch message catalog.

--
Tcl Core Team and Maintainers
Don Porter, Tcl Core Release Manager

--
| Don Porter Mathematical and Computational Sciences Division |
| donald.porter at nist.gov Information Technology Laboratory |
| http://math.nist.gov/~DPorter/ NIST |
|______________________________________________________________________|

2008-02-05

Tcl/Tk 8.5.1 RC1


定より一週間程度リリースが遅れる予定だった Tcl/Tk 8.5.1 ですが、リリース候補 1 (RC1) tcl8.5.1rc1-src.tar.gztcl8.5.1rc1-html.tar.gztk8.5.1rc1-src.tar.gz がアップされました。リリースノートが整い次第、正式版が公開されるようです。

Date: Mon, 04 Feb 2008 13:18:35 -0500
From: Donald G Porter
To: Tcl Core List
Subject: [TCLCORE] Tcl/Tk 8.5.1 RC 1

...is available for your testing from

ftp://ftp.tcl.tk/pub/tcl/tcl8_5/

If you plan to test, please do so ASAP. I expect to make these RCs
into the real 8.5.1 releases just as soon as I can complete release
notes. That is, hours, not days from now.

--
| Don Porter Mathematical and Computational Sciences Division |
| donald.porter at nist.gov Information Technology Laboratory |
| http://math.nist.gov/~DPorter/ NIST |
|______________________________________________________________________|

2008-02-04

Win32 Binary Checker (つづき 2)

SourceForge.net Logo

末にリリースする予定だった wbc ですが、パッケージとして公開するには不備な点が多く、とりあえず以下に CVS のレポジトリを作成しました。

http://mingw-cross.cvs.sourceforge.net/mingw-cross/wbc/

もう少し完成度を高めてから、RPM パッケージとして公開したいと考えていますが、今後は、いつでも CSV からスクリプトをダウンロードができます。このスクリプトの動作には、MinGW のクロスコンパイラが、/usr/local 以下にインストールされていて、Tcl/Tk 8.4.5 以上と、拡張パッケージ tile が必要になります。なお、Tcl/Tk 8.5 系を既に利用している場合には、tile は必要ありません。動作環境は、現時点で Fedora Linux 8 を想定しています。

拡張パッケージ tile の RPM を作成するためのスペックファイルは、以下に tile.spec のファイル名でアップロードしてあります。

http://mingw-cross.cvs.sourceforge.net/mingw-cross/specs/