Tcl features
- coroutine
- lists
- lmap
- try - trap - finally
Tk features
- canvas
- text rotation in an arbitrary direction
pacman -S libffi-devel pacman -S zlib-devel |
./configure --with-tcl=/c/src/tcl8.6.10/win --prefix=/c/bin/tcl8.6.10 make install |
This is binary build of William Joye's TkBLT.
./configure --prefix=/c/bin/tcl8.6.10 --with-tcl=/c/src/tcl8.6.10/win --with-tk=/c/src/tk8.6.10/win --enable-threads CC=g++ CPPFLAGS="-static" make install |
./configure --prefix=/c/bin/tcl8.6.10-x64 --with-tcl=/c/src/tcl8.6.10-x64/win --with-tk=/c/src/tk8.6.10-x64/win --enable-threads CC=g++ --enable-64bit CPPFLAGS="-static" make install |
I needed to delete the following files in MSYS2 in order to remove the dependency on MinGW DLLs. CPPFLAGS="-static" was not enough.
TkBLT is a stab-enabled package but it works with the exact patchlevel at which it was built. I used Tcl/Tk 8.6.8. So it can't be used in 8.6.7 or 8.6.9. I found a workaround. Note that it might be against author's intention.
Tcl/Tkのスクリプトを単体実行ファイルとして配布するのに使うTclkitは、ActiveTclと一緒に配布されるbasekitというのを使っておけば、検証済みの最新バージョンなので問題は少ないのですが、日本語パスやスペースを含むパスから実行しようとするとエラーになるという、何とも前時代的な制約があります。これはフリーソフトとして配布するソフトを作る時にはちょっと受け入れがたいです。そこで、その他のTclkitを手に入れるか、自分でビルドするわけですが。。。ものすごくサイズにこだわりがなければ、今時はKitCreatorのページで出来合いのものを取ってくるのが無難な入手方法です。
手動ビルド版
http://tclkits.rkeene.org/fossil/wiki/Downloads
自動ビルド版(最新版)
http://www.rkeene.org/devel/kitcreator/kitbuild/nightly/
ダウンロードファイルに拡張子.exeをつけます。
ちょっとサイズが大きいので、upxという実行ファイル圧縮ツールを使って小さくするのがお勧めです。
G:\Downloads>upx -k tclkit-8.5.18-win32-i586-threaded-xcompile.exe Ultimate Packer for eXecutables Copyright (C) 1996 - 2013 UPX 3.91w Markus Oberhumer, Laszlo Molnar & John Reiser Sep 30th 2013 File size Ratio Format Name -------------------- ------ ----------- ----------- 4378912 -> 2759968 63.03% win32/pe tclkit-8.5.18-win32-i586-threaded-xcompile.exe Packed 1 file. G:\Downloads>ls -l --block-size=KB tclkit-8.5.18-win32-i586-threaded-xcompile.ex* -rwxrwxrwx 1 yusuke 0 4379kB 2015-06-09 23:31 tclkit-8.5.18-win32-i586-threaded-xcompile.ex~ -rwxrwxrwx 1 yusuke 0 2760kB 2015-06-09 23:31 tclkit-8.5.18-win32-i586-threaded-xcompile.exe |
半導体製造装置とホストとの間の通信にはSEMI Standardで標準化されているHSMS-SS/SECS-IIというプロトコルが使われるのが一般的なのだが、このデバッグツール類はお高いものが多い。Wiresharkにも専用のdissectorはついてないので、自分でプラグインを書くか、サードパーティのdissector pluginを探すしかない。dissectorはDLLまたはLuaスクリプトとして追加できるらしい。
How can I add a custom protocol analyzer to wireshark? - StackOverflow
問題児たちがwiresharkのdissectorをLuaで書くそうですよ? - 迷い庭
というか、ここに古いpluginのソースコードが置いてあった。
Bug 8879 - HSMS protocol dissector plugin bug
古くて動作はしないけど、参考にはなりそう。ただ、今はLuaで書いたほうがいいんだろうか。
Prerequisites
Build tool = MinGW GCC v7.2.0
Tcl build path = /c/src/tcl8.6.8/win
Tcl install path = /c/bin/tcl8.6.8
SQLite3 build path = /c/src/sqlite-autoconf-3240000/tea
wxSQLite3 secure source path = /c/src/wxsqlite3-4.0.4/sqlite3secure/src
Tcl
./configure --prefix=(Tcl install path)
make install
Tk
./configure --prefix=(Tcl install path) --with-tcl=(Tcl build path)
make install
TclSQLite
Copy the files in (wxSQLite3 secure source path) to (SQLite3 build path)/generic.
Open tclsqlite3.c and replace "sqlite3.c" by "sqlite3secure.c" in the line #4.
cd (SQLite3 build path)
./configure --enable-threads --prefix=(Tcl install path) --with-tcl=(Tcl build path) CFLAGS="-DSQLITE_HAS_CODEC -DCODEC_TYPE=CODEC_TYPE_AES128 -DSQLITE_ENABLE_FTS4_UNICODE61"
make install
This also works with ActiveTcl.
I could not make sqlite3 v3.8.2 independent from libgcc_s_dw2-1.dll with MinGW gcc v4.8.1.
I don't know the reason. But I could build it with nmake.
For example:
nmake -f makefile.vc TCLDIR=(Tcl install path) INSTALLDIR=(Tcl install path) OPTDEFINES="-DSQLITE_HAS_CODEC"
SQLiteのアカウントデータベースを使って、ユーザー名、パスワードで認証の可否、アカウント情報を取得するようなコンソールアプリを作った。
C++からパイプ経由で呼び出されるのだが、EF使ってたりデータベースのパスワード保護をやってるせいか、接続の初期化に時間がかかって非常に遅かった。
パイプ繋ぎっぱなしというのも考えたけど、使う人が嫌がったので、
ラッパーDLLをリンクしてC++アプリの起動時にだけ接続処理がされるようにしようと思った。
最終的には以下のような構成になった。
accounts.db (SQLite3データベース System.Data.SQLiteの機能で暗号化)
AuthLib.dll (Managed DLL、System.Data.SQLite.dllを使ってデータベースを操作する)
AuthLibHost.exe (Native C++、メインの実行ファイル)
AuthLibHost.exe.config (接続文字列などの情報が書かれた設定ファイル)
AuthLibNative.dll (Mixed mode assembly、AuthLibHostとAuthLibの橋渡し役)
System.Data.SQLite.dll (Mixed mode assembly)
データベースに関するビジネスロジックはAuthLib.dllにすべて実装されているが、
これに対応するラッパー関数をAuthLibNativeにたくさん書くのが面倒だったので、
すべてEvalという一つの関数を経由するようにした。
Evalの引数はコマンドラインインターフェースと類似したargc, argsといったものにして、
加えて出力を格納するための、linesという文字列の配列とその要素数の参照を渡せるようにする。
成功、失敗をEvalの戻り値にする。
ラッパーが不要なC++/CLIを選ぶか、ラッパー書くのが面倒だけど
LINQ to Entitiesとか使えるC#を選ぶかというところですな。
KitCreator Build and Test Status (Nightly build)
最新のバイナリが入手可能。サイズが大きめ。
Windowsの場合はダウンロードしたファイルの拡張子をexeに変える。
http://www.rkeene.org/devel/kitcreator/kitbuild/nightly/
Cookit
Tclkitとはちょっと方式が違うらしい。バイナリはやや古いものしかない。
http://www.endorser.org/en/blog/tcl/cookit/download
Tclkit
バイナリはかなり古く、更新停止中。
https://code.google.com/p/tclkit/wiki/BuildingTclkit
Kitgen build system
自分で作りたい方向け
http://sourceforge.net/projects/kbskit
Tcl8.6系でTDBCをビルトインしてるのがあったらほしいけど今のところ見当たらない。
他にもあった気がするけど思い出したら追記する。
Kitgenで作った小さめのバイナリが手元にあるけど、どこかに置いとこうかな。。。
kitgenが正式にサポートしているのはVC6からVC8(2005)までです。
VS2008~VS2013についても、いくつか変更を加えてやればビルドできます。
ただ、これはTclに限ったことではないのですが、VS2012で普通にビルドした実行ファイルはXPで動作しません。SDK 7.1Aにリンクすればビルドできますが、VS2010以前を持ってる人にとっては面倒なだけでメリットがないので古いVSを使った方がいいです。(参考ページ)。
あと、これはいいのかどうか分かりませんが、VC6でビルドするとOS標準添付のC++ランタイム(msvcrt.dll)をリンクするので、別途ランタイムをインストールすることなく動作します。MinGWでビルドした場合もそうなるのでまあ問題ないんじゃないでしょうか。
kitgen/Makefile.vc
70c70 < CFLAGS = -W3 -D_WINDOWS -DWIN32 -DSTATIC_BUILD --- > CFLAGS = -W3 -D_WINDOWS -DWIN32 -DSTATIC_BUILD -D_CRT_SECURE_NO_WARNINGS 142c142,148 < !if $(VCVERSION) >= 1500 --- > !if $(VCVERSION) >= 1800 > VCVER=12 > !elseif $(VCVERSION) >= 1700 > VCVER=11 > !elseif $(VCVERSION) >= 1600 > VCVER=10 > !elseif $(VCVERSION) >= 1500 |
kitgen/8.x/mk/tcl/mk4tcl.cpp
2597c2597 < EXTERN int Mk4tcl_Init(Tcl_Interp *interp) { --- > int Mk4tcl_Init(Tcl_Interp *interp) { 2601c2601 < EXTERN int Mk_Init(Tcl_Interp *interp) { --- > int Mk_Init(Tcl_Interp *interp) { 2605c2605 < EXTERN int Mk4tcl_SafeInit(Tcl_Interp *interp) { --- > int Mk4tcl_SafeInit(Tcl_Interp *interp) { 2609c2609 < EXTERN int Mk_SafeInit(Tcl_Interp *interp) { --- > int Mk_SafeInit(Tcl_Interp *interp) { |
kitgen/8.x/mk/tcl/mk4tcl.h
382a383,391 > > > EXTERN int Mk4tcl_Init(Tcl_Interp *interp); > > EXTERN int Mk_Init(Tcl_Interp *interp); > > EXTERN int Mk4tcl_SafeInit(Tcl_Interp *interp); > > EXTERN int Mk_SafeInit(Tcl_Interp *interp); |
kitgen/8.x/itcl/win/rules.vc
195c195,201 < !if $(VCVERSION) >= 1500 --- > !if $(VCVERSION) >= 1800 > VCVER=12 > !elseif $(VCVERSION) >= 1700 > VCVER=11 > !elseif $(VCVERSION) >= 1600 > VCVER=10 > !elseif $(VCVERSION) >= 1500 |
kitgen/8.x/mk/win/rules.vc
187c187,195 < !if $(VCVERSION) >= 1400 --- > !if $(VCVERSION) >= 1800 > VCVER=12 > !elseif $(VCVERSION) >= 1700 > VCVER=11 > !elseif $(VCVERSION) >= 1600 > VCVER=10 > !elseif $(VCVERSION) >= 1500 > VCVER=9 > !elseif $(VCVERSION) >= 1400 189,190d196 < _VC_MANIFEST_EMBED_EXE=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 < _VC_MANIFEST_EMBED_DLL=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 195a202,205 > !if $(VCVERSION) >= 1400 > _VC_MANIFEST_EMBED_EXE=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 > _VC_MANIFEST_EMBED_DLL=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 > !endif |
kitgen/8.x/thread/win/rules.vc
195c195,201 < !if $(VCVERSION) >= 1500 --- > !if $(VCVERSION) >= 1800 > VCVER=12 > !elseif $(VCVERSION) >= 1700 > VCVER=11 > !elseif $(VCVERSION) >= 1600 > VCVER=10 > !elseif $(VCVERSION) >= 1500 |
kitgen/8.x/vqtcl/win/rules.vc
195c195,201 < !if $(VCVERSION) >= 1500 --- > !if $(VCVERSION) >= 1800 > VCVER=12 > !elseif $(VCVERSION) >= 1700 > VCVER=11 > !elseif $(VCVERSION) >= 1600 > VCVER=10 > !elseif $(VCVERSION) >= 1500 |
8.6.1をビルドするには、kitgen、Tcl、Tkのソースをダウンロードして、
以下にコピーします。
C:\src\kitgen C:\src\kitgen\8.6.1\tcl C:\src\kitgen\8.6.1\tk
Visual Studioのコマンドプロンプトを開き、
mkdir C:\src\kitgen\8.6.1\kit-msvc cd C:\src\kitgen\8.6.1\kit-msvc echo all: lite heavy > Makefile echo !include ..\..\Makefile.vc >> Makefile nmake -f Makefile.vc -nologo VERSION=86 KITOPTS=”-t -z”
ちなみに、tdbc関連のモジュールが大量にビルド失敗しますが、使わない限りは問題ありませんでした。
TclAppを使うと、Tcl/Tkのスクリプトと実行環境を単一のEXEファイルにラップすることができるのですが、このときprefixファイルといって、ベースとなる実行ファイルを指定する必要があります。これをtclkitとかbasekitとか呼び、標準ライブラリや最低限のエンコーディングファイルなどが含まれていて、自分で開発したアプリに必要な、スクリプト一式、ライブラリ、エンコーディングなどを、TclAppを使って追加することで単体のアプリとして動作するようになります。アイコンやバージョン情報なども、prefixに組み込まれているものを置き換えることもできます。
prefixとして使えるファイルは、実はActiveTclにbasekitという名前でついてきます(Tcl/binフォルダにある)。これがあれば別に自分でtclkitを入手する必要はないのですが、2点ほど問題があります。
ということで、私にとっては不都合だったので、basekitをやめてtclkitを使うことにしました。tclkitのWindowsバイナリはTcl8.5.13まではhttp://www.patthoyts.tk/tclkitで配布していたのですが、8.5.14がなかなか出ないなあと思っていたら今日見たら落ちてました。また、配布しているものにはtzdataというタイムゾーンの定義ファイルがないので、時刻表示が狂う場合がありました。そういう理由があって、自分でコンパイルすることにしました。前置きが長くなりましたが、以下がその手順です。Windows7 Professional SP1 32bit上で試しました。
Visual Studio 6.0 (Visual Studio 2003でもいいと書いてあった。)
Microsoft Platform SDK Febuary 2003 (Last version with VC6 support)
C:\src\kitgenに展開。
C:\src\kitgen\8.5\tcl
C:\src\kitgen\8.5\tkに展開。
VC6のコマンドプロンプトを開く
mkdir C:\src\kitgen\8.5\kit-msvc
cd C:\src\kitgen\8.5\kit-msvc
echo all: lite heavy > Makefile
echo !include ..\..\Makefile.vc >> Makefile
これはお好みですが、kitgenに添付されているものを使うと、TclAppでバージョン情報を編集できなくなるので、変更することをお勧めします。
C:\src\kitgen\tclkit.rcをテキストエディタで開き、CommentとPaddingを削除する。
VALUE "Comments", "Comments\0More Comments\0" VALUE "Padding", " " " " " " " \0"
Platform SDKを参照するようにします。また、KITOPTS=-zというオプションを与えることで、tzdataが含まれるようにします。他にもオプションがありますが、kitgenのREADMEファイルを読んでください。
set INCLUDE=C:\PROGRA~1\MIC1C5~1\include;%INCLUDE%
nmake -f Makefile.vc -nologo VERSION=85 KITOPTS="-z"
C:\src\kitgen\8.5\kit-msvcの中にできる、tclkit-cli.exe、tclkit-gui.exeをTclAppのprefixに指定できます。