[Tcl/Tk] freewrapの使い方

Pocket

Tclのスクリプトを実行形式化してくれるfreewrapの使い方。自分用メモです。

使い方

freewrapはコマンドラインツールです。以下のようにコマンドを入力します。

例1:freewrap myapp.tcl

これでmyapp.tclというファイルをmyapp.exeに変換します。スクリプトファイル1つだけで構成されているならこれだけでOKです。

例2:freewrap myapp.tcl source2.tcl source3.tcl

ソースファイルが複数ある場合は、このようにスペースで区切って並べます。この例ではソースが全て同じディレクトリに入っている状態を想定していますが、ディレクトリのパスを指定する場合は次のように入力します。

例3:freewrap myapp.tcl C:\dev\lib\source2.tcl C:\myproject\source\source3.tcl

この際、注意しなければいけないのは、実行形式化したファイル内でこれらソースファイルを参照する方法です。上掲のsource2.tclをsourceしたい場合はスクリプトファイルで次のように参照する必要があります。

source /dev/lib/source2.tcl

このようにドライブレターを削除し、バックスラッシュではなくスラッシュで区切る形式でパスを指定します。これは、freewrapが仮想ファイルシステム(VFS)を使用しているためです。

ちなみに、ソースファイルではなく、Tclのライブラリファイルを含める場合も同様のコマンドで対応可能ですが、ライブラリが入っているディレクトリをauto_pathに追加してからpackage requireを行う必要があります。

例4:freewrap myapp.tcl C:\myapp\lib\util\util.dll C:\myapp\lib\util\pkgIndex.tcl

上のコマンドで作成した実行形式ファイル内で、このutilというパッケージを使いたい場合、次のようにauto_pathにライブラリのパスを設定し、それからpackage requireします。

lappend auto_path /myapp/lib/util
package require util

ある程度の規模のプロジェクトになると呼び出すライブラリや読み込むソースファイルが大量になり、上記のように毎回コマンドラインでファイル名を入力するのは現実的ではありません。-fオプションを利用すると、テキストファイルにパスを列挙して実行形式ファイルに含めることができます。まず、次のように1行に1つのパスを記述したテキストファイル(例:filelist.txt)を作成します。

C:\tcl\lib\hoge\hoge.tcl
C:\tcl\lib\hoge\hoge111.dll
C:\tcl\lib\hoge\pkgIndex.tcl
C:\tcl\lib\moge\moge.tcl
C:\tcl\lib\moge\moge311.dll
C:\tcl\lib\moge\pkgIndex.tcl

次のコマンドでこれらファイルを実行形式ファイルに含めます。

例4:freewrap myapp.tcl -f filelist.txt

アプリケーションのアイコンを変更

freewrapで実行形式化したEXEファイルは、アイコンがfreewrapの公式アイコンになります。ちょっと個性的なアイコンですので、おそらく変更したくなると思います。

freewrapのアイコン
freewrapのアイコン

自前のアイコンを用意し、公式アイコンを置き換える場合、指定フォーマットのアイコンファイル(*.ico)を合計9ファイル作成する必要があります。フォーマットは下表の通りです。

Size Colors
16×16 16
16×16 256
32×32 16
32×32 256
32×32 24-bit
48×48 16
48×48 256
48×48 24-bit
128×128 24-bit

この9つのファイルを1つのicoファイルにまとめます。マルチアイコンの作成は@icon変換が便利です。

できあがったアイコンファイル(例:ex.ico)をfreewrapに適用するには、以下のように-iオプションを使います。

例5:freewrap myapp.tcl -i ex.ico

なお、アプリケーションのタイトルバーやタスクバーに表示されるアイコンを変更するには、wm iconphoto を使ってトップレベルのアイコンを指定します。


#wm iconphoto の例
image create photo sampleico -data {
   R0lGODlhFgAWAIUAAPwCBAROdBx2rBRunDSOvDSGvCyCvBRynEySvDyOvBx6
   pBRmlARijIy+1Hy21GSmzEyaxDSKvBx6rBRypAxmnAxilKTK3HSy1DySxBxy
   pARahMze7IS23BRyrARCXIS21CyCtBR2pAxqlARilFyexFSezAxqnARWhARW
   fARSfDyOxBRupFyClIy+3ESWxAxmjARejLSytLTS7AxunPz+/AQCBMzKzIyO
   jERyhDRmfAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAWABYAAAbN
   QIBwSCwaj8ikMhBQIpmCQdM5ZBIKhoOUykQkCAbFYMGYHpkNxwOCiEgmFErF
   XA2kLY7LGiMRUDIMGnRMG3ccHHsSHYCBgkMehA0feGsEICEDIo1MQpAjAYUk
   DyUQBG8mJgwnKExNkClloRAqBhIrIponKSkBLJ1MFKAtLiCnLwwwKCksMUSQ
   AcEyDi4TMyLJyzQ0zc4eHsEbLQea2drbNUUeu7Et5do2NzgeRs8MKTnmNPDy
   Sc8e5vvmOYH0LyCVRx7iCTyIkKFDInaCAAAh/mhDcmVhdGVkIGJ5IEJNUFRv
   R0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFs
   bCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7
}
wm iconphoto . sampleico
上述の9つのicoファイルを作成するのが意外に大変です。私はいろいろなツールを試しましたが、最終的にはWindowsのペイントで各サイズ、各色数のBMPファイルを作成しました。ペイントは保存時に色数を指定し、16色、256色、24ビットのBMPを作成できます。そして、できあがったBMPファイルの拡張子をbmpからicoに変更するとアイコンファイルの完成です(拡張子を変更するだけでicoファイルになるのはちょっと不思議ですが)。こうしてできあがったアイコン9ファイルを@icon変換で1ファイルにまとめて一丁上がりです。

freewrapの制限事項

freewrapには制限もいくつかありますが、私が一番戸惑ったのはデータベースです。アプリケーション内で使用するsqliteデータベースを同梱するかたちで実行形式化したところ、「sqlite3 db /db/sample.db」とすると「unable to open database file」というエラーが出て開けません。「file exists /db/sample.db」は1を返しているのでしばらく悩みました。

上でも書きましたが、freewrapは仮想ファイルシステムを採用しており、同梱したファイルは仮想ファイルとして処理されます。この仮想ファイルをsqliteが扱えないため、データベースは存在するけれど開けない、という事態が起こるようです。データベースファイルは、freewrap内に含めないかたちにする必要があります。

参考:Tcl VFS integration for Sqlite3

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください