2009-07-21

Let's Wine(第8回)


winetricks


winetricks は、Wine の 環境に、代表的なランタイムパッケージやアプリケーションを導入するスクリプトです。動作には wget と cabextract が必要になります。

wget は既にインストールされている可能性が高いのですが、一緒にインストールを試みます。(調べればすぐわかることですが、ものぐさしています。)

$ su
パスワード:
$ yum install wget cabextract
Loaded plugins: refresh-packagekit
Setting up Install Process
Package wget-1.11.4-3.fc11.i586 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package cabextract.i586 0:1.2-2.fc11 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
cabextract i586 1.2-2.fc11 fedora 55 k

Transaction Summary
================================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)

Total download size: 55 k
Is this ok [y/N]: y
Downloading Packages:
cabextract-1.2-2.fc11.i586.rpm | 55 kB 00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : cabextract-1.2-2.fc11.i586 1/1

Installed:
cabextract.i586 0:1.2-2.fc11

Complete!
$ exit

適当な場所を用意して、winetricks をダウンロードします。

$ mkdir winesrc
$ cd winesrc
$ wget http://www.kegel.com/wine/winetricks
--2009-07-21 21:41:35-- http://www.kegel.com/wine/winetricks
www.kegel.com をDNSに問いあわせています... 216.92.86.126
www.kegel.com|216.92.86.126|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 86250 (84K) [text/plain]
`winetricks' に保存中

100%[======================================>] 86,250 104K/s 時間 0.8s

2009-07-21 21:41:37 (104 KB/s) - `winetricks' へ保存完了 [86250/86250]

$

winetricks でインストールできるソフトウェアは、下に記した参考サイト [1] の Options に列挙されていますが、ここでは IE6 をインストールしてみましょう。

$ sh winetricks ie6
Executing wget -O InstMsiA.exe -nd -c --read-timeout=300 --retry-connrefused --h
eader Accept-Encoding: gzip,deflate http://download.microsoft.com/download/Windo
wsInstaller/Install/2.0/W9XMe/EN-US/InstMsiA.exe
--2009-07-21 21:48:20-- http://download.microsoft.com/download/WindowsInstaller
/Install/2.0/W9XMe/EN-US/InstMsiA.exe
download.microsoft.com をDNSに問いあわせています... 210.155.101.246, 210.155.101
.231
download.microsoft.com|210.155.101.246|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1709160 (1.6M) [application/octet-stream]
`InstMsiA.exe' に保存中

100%[======================================>] 1,709,160 1.04M/s 時間 1.6s

2009-07-21 21:48:22 (1.04 MB/s) - `InstMsiA.exe' へ保存完了 [1709160/1709160]

Executing cabextract --directory=/home/bitwalk/.wine/drive_c/winetrickstmp /home
/bitwalk/.winetrickscache/InstMsiA.exe
Extracting cabinet: /home/bitwalk/.winetrickscache/InstMsiA.exe
extracting /home/bitwalk/.wine/drive_c/winetrickstmp/msi.dll
(一部省略)
extracting /home/bitwalk/.wine/drive_c/winetrickstmp/mspatcha.dll
extracting /home/bitwalk/.wine/drive_c/winetrickstmp/sdbapi.dll

All done, no errors.
Executing cp -f /home/bitwalk/.wine/drive_c/winetrickstmp/msls31.dll /home/bitwa
lk/.wine/drive_c/windows/system32
Executing wine iexplore -unregserver
Using native,builtin override for following DLLs: iexplore.exe itircl itss jscri
pt mlang mshtml msimtf shdoclc shdocvw shlwapi urlmon
Executing wine regedit /home/bitwalk/.wine/drive_c/winetrickstmp/override-dll.re
g
Setting Windows version to win2k
Executing wine regedit /home/bitwalk/.wine/drive_c/winetrickstmp/set-winver.reg
Executing wget -O ie6sites.dat -nd -c --read-timeout=300 --retry-connrefused --h
eader Accept-Encoding: gzip,deflate http://www.microsoft.com/windows/ie/ie6sp1/d
ownload/rtw/x86/ie6sites.dat
--2009-07-21 21:48:24-- http://www.microsoft.com/windows/ie/ie6sp1/download/rtw
/x86/ie6sites.dat
www.microsoft.com をDNSに問いあわせています... 207.46.192.254, 207.46.193.254
www.microsoft.com|207.46.192.254|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2788 (2.7K) [application/octet-stream]
`ie6sites.dat' に保存中

100%[======================================>] 2,788 --.-K/s 時間 0.001s

2009-07-21 21:48:24 (2.91 MB/s) - `ie6sites.dat' へ保存完了 [2788/2788]

Executing wget -O ie6setup.exe -nd -c --read-timeout=300 --retry-connrefused --h
eader Accept-Encoding: gzip,deflate http://download.microsoft.com/download/ie6sp
1/finrel/6_sp1/W98NT42KMeXP/EN-US/ie6setup.exe
--2009-07-21 21:48:25-- http://download.microsoft.com/download/ie6sp1/finrel/6_
sp1/W98NT42KMeXP/EN-US/ie6setup.exe
download.microsoft.com をDNSに問いあわせています... 65.54.91.93, 65.54.91.94
download.microsoft.com|65.54.91.93|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 491768 (480K) [application/octet-stream]
`ie6setup.exe' に保存中

100%[======================================>] 491,768 986K/s 時間 0.5s

2009-07-21 21:48:25 (986 KB/s) - `ie6setup.exe' へ保存完了 [491768/491768]

err:setupapi:SetupDefaultQueueCallbackW copy error 2 L"C:\\windows\\msdownld.tmp
\\AS026AFE.tmp\\IEEX\\expinst.exe" -> L"C:\\Program Files\\Internet Explorer\\W2
K\\expinst.exe"
mmap() failed: メモリを確保できません
(一部省略)
mmap() failed: メモリを確保できません
\AS0271D1.tmp\setup_wm.exe: pulse.c:200: pulse_new: Assertion `p->context' が失
敗しました.
err:module:import_dll Library DRMClien.DLL (which is needed by L"C:\\windows\\sy
stem32\\dxmasf.dll") not found
Clearing Windows version back to default
Executing wine regedit /home/bitwalk/.wine/drive_c/winetrickstmp/unset-winver.re
g
Install of ie6 done
winetricks done.
$

IE6 のインストーラが起動します。

コンソール上にいろいろエラーメッセージが出ていますが、なんとかインストールが終了します。とにかく IE6 を起動してみましょう。ショートカットがないので、直接起動してみます。

$ wine cmd
CMD Version 1.1.23

Z:\home\bitwalk>c:
C:\>dir
Volume in drive C is
Volume Serial Number is 0000-0000

Directory of C:\

2009/07/21 21:50 <DIR> Program Files
2009/06/16 21:24 <DIR> users
2009/07/21 21:53 <DIR> windows
2009/07/21 21:53 <DIR> winetrickstmp
0 files 0 bytes
4 directories 25,903,710,208 bytes free

C:\>cd program files
C:\Program Files>dir
Volume in drive C is
Volume Serial Number is 0000-0000

Directory of C:\Program Files

2009/07/21 21:50 <DIR> .
2009/07/21 21:50 <DIR> ..
2009/07/21 21:50 <DIR> Common Files
2009/07/21 21:53 <DIR> Internet Explorer
2009/07/21 21:50 <DIR> Outlook Express
0 files 0 bytes
5 directories 25,903,726,592 bytes free

C:\Program Files>cd internet explorer
C:\Program Files\Internet Explorer>dir
Volume in drive C is
Volume Serial Number is 0000-0000

Directory of C:\Program Files\Internet Explorer

2009/07/21 21:53 <DIR> .
2009/07/21 21:50 <DIR> ..
2009/07/21 21:50 <DIR> 1033
2009/07/21 21:50 <DIR> Connection Wizard
2002/08/29 7:14 155,648 DW15.EXE
(一部省略)
2002/08/29 7:14 91,136 IEXPLORE.EXE
2009/06/26 19:59 2,524 iexplore.exe.bak
2002/08/29 7:14 41,224 readme.txt
2009/07/21 21:50 <DIR> SIGNUP
2002/08/29 7:14 21,809 support.txt
2009/07/21 21:50 <DIR> W2K
9 files 890,890 bytes
6 directories 25,903,022,080 bytes free

C:\Program Files\Internet Explorer>iexplore

まず、どこかで見たことがあるメッセージがでます。
Yes をクリックして次に進むと、IE6 が無事表示されます。

安定度はわかりませんが、日本語フォントも表示され、それなりに使えそうです。

参考サイト
[1] winetricks - The Official Wine Wiki
 

2009-07-20

Win32 用 GTK ランタイムライブラリ

Get MinGW Cross Compiler at SourceForge.net. Fast, secure and Free Open Source software downloads

Fedora 上でクロスコンパイルした GTK2 のアプリケーションを手軽に Windows 環境で実行できるようにと、Fedora の MinGW パッケージをベースにして、GTK2 のランタイムパッケージのインストーラを作りました。まだ必要最低限のパッケージしか収録していませんが、今後、必要な収録パッケージを吟味して増やしていきたいと考えています。

Browse MinGW Cross Compiler Files on SourceForge.net
- gtk2-2.16.1-001-20090720.exe

インストール先の bin にパスを通すときは、この画面でチェックを入れます。

デフォルトのインストール先以外を選択したときには、インストール後に、etc/pango/pango.modules の内容を編集してライブラリの参照先を適切に指定してください。これを怠るとフォントが正しく表示されません。インストーラの方で、このあたりの設定もサポートするようにしたいのですが、準備に時間がかかりそうだったので、今回は何もしていません。

2009-07-18

wxWidgets でもクロスコンパイル(2)

Get MinGW Cross Compiler at SourceForge.net. Fast, secure and Free Open Source software downloads

Fedora 11 から Win32 クロスコンパイル用パッケージが正式にサポートされるようになって、自分の SourceForge.net のプロジェクトサイトで、クロスコンパイル用 RPM パッケージの公開に対するモチベーションが下がってしまい、活動が低調になっていました。

とあるユーザから、wxWidgets 用の RPM を Fedora 11 用にも公開してほしいというメールを受け取りました。

Date: Thu, 16 Jul 2009 14:51:21 +0200
Subject: mingw-wxwidgets on fedora11?
From: ##### ######### <#####.########@gmail.com>
To: bitwalk at users.sourceforge.net

Dear ####### #########,

I've succesfully used your rpm packaging of mingw32-wxWidgets on fedora 10
(mingw32-wxWidgets-2.8.9-2.fc10.noarch.rpm), it was really helpful to me in
developing a cross-platform application that I need to mantain. So much
important that the only thing that I'm actually waiting for before
switching to fedora11 is exactly the release of the same package for
fedora11. So I would like to ask you if you have any plan to release such
package for fedora11, or if there is any way that I can use the f10
package on fedora11.

Thank you very much for your attention and many thanks for your great work,
##### ########

wxWidgets の RPM パッケージについては、Fedora MinGW のメーリングリストで話題が出ていたので、きっと誰かが作るだろうと放っておいたのでした。しかし、直接メールを送ってくれるユーザがいれば話は別です。返事を出して早速パッケージを作成しました。

Browse MinGW Cross Compiler Files on SourceForge.net
- mingw32-wxWidgets-2.8.10-1.fc11.noarch.rpm
- mingw32-filesystem-50-3.fc11.2.noarch.rpm

このサイトで公開した mingw32-filesystem は、wxWidgets のファイルの依存性を解決するために必要になります。

以前、「wxWidgets でもクロスコンパイル」で紹介したサンプルを再掲して、現在の環境に合わせたクロスコンパイル方法を紹介します。サンプルは以下をベースにしています。

Hello World - wxWidgets

表示される文字列を日本語にした他は、同じプログラムです。

// Hello World program with wxWidgets
#include "wx/wx.h"

class MyApp: public wxApp
{
virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:

MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);

DECLARE_EVENT_TABLE()
};

enum
{
ID_Quit = 1,
ID_About,
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(_T("こんにちは、世界!"),
wxPoint(50,50), wxSize(450,340));
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
wxMenu *menuFile = new wxMenu;

menuFile->Append(ID_About, _T("このプログラムについて(&A)"));
menuFile->AppendSeparator();
menuFile->Append(ID_Quit, _T("終了(&x)"));

wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, _T("ファイル(&F)"));

SetMenuBar(menuBar);

CreateStatusBar();
SetStatusText(_T("wxWidgets へようこそ!"));
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox(_T("はじめてのプログラム、こんにちは、世界!"),
_T("このプログラムについて"), wxOK | wxICON_INFORMATION, this);
}
// END PROGRAM
// hello.cpp


コンパイルには、Linux の pkg-config を利用するので、MinGW のバイナリがインストールされている /usr/i686-pc-mingw32/sys-root/mingw/bin へパスを通しておきます。もし、Linux 用の wxWidgets もインストールされている場合には、検索パスを順序も含めて適正に指定するか、pkg-config の代わりに MinGW クロスコンパイル用の i686-pc-mingw32-pkg-config を利用すればいいでしょう。

$ export PATH=$PATH:/usr/i686-pc-mingw32/sys-root/mingw/bin
$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/b
in:/usr/local/sbin:/usr/sbin:/sbin:/home/bitwalk/bin:/opt/mingw32ce/bin:/usr/i68
6-pc-mingw32/sys-root/mingw/bin

$ i686-pc-mingw32-g++ hello.cpp `wx-config --libs` `wx-config --cxxflags`
-o hello.exe


wbc で、ビルドした hello.exe が依存する DLL を調べると、次の様になります。




Wine


Wine 上で実行した例を示しました。

$ ./hello.exe


Windows


関連する DLL と一緒に Windows Vista へコピーして実行すると以下の様になります。とりあえず日本語表示は問題なさそうです。

Linux


Linux 上で Win32 用にクロスコンパイルしましたが、wxWidgets はクロスプラットフォーム対応のツールキットですので、Linux 上でそのまま、Linux ネイティブ用にコンパイルして実行することも(もちろん)できます。

$ g++ hello.cpp `wx-config --libs` `wx-config --cxxflags` -o hello
$ ./hello



[1] MinGW クロスコンパイル環境の設定