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したい場合はスクリプトファイル(この場合は myapp.tcl )で次のように参照する必要があります。
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の公式アイコンになります。ちょっと個性的なアイコンですので、おそらく変更したくなると思います。
自前のアイコンを用意し、公式アイコンを置き換える場合、指定フォーマットのアイコンファイル(*.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
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