Ffidl0.8 binary for Win32

Build libffi from source

https://stackoverflow.com/a/40642406/323107

1. Download and install the latest version of MSYS2
   a) download the latest (64-bit or 32-bit) installer from http://msys2.github.io
   b) run the installer accepting default settings
   c) execute the following commands to update the system core
       pacman -Sy pacman
       pacman -Syu
       pacman -Su
   d) restart MSYS2, if requested to do so
   e) execute the following command to install development tools
      for 64-bit gcc:
       pacman --needed -S base-devel dejagnu mingw-w64-x86_64-gcc
      for 32-bit gcc:
       pacman --needed -S base-devel dejagnu mingw-w64-i686-gcc
   f) restart MSYS2
2. Download and compile the latest version of libffi
   a) download the latest source code bundle from https://github.com/libffi/libffi/releases
   b) unpack the source code bundle in MSYS2 tmp directory (e.g. C:\src\libffi-3.4.2)
   c) execute the following MSYS2 commands to compile libffi (adapt the version number):
       cd /c/src/libffi-3.4.2
       ./autogen.sh
       ./configure --prefix=/src/out --enable-static --disable-shared
       make
   d) copy the distributable files to the configured /c/src/out directory
       make install
      the following files are needed for the next step:
       /c/src/out/include/ffi.h
       /c/src/out/include/ffitarget.h
       /c/src/out/lib/libffi.a

Build Ffidl-0.8 from source

./configure --enable-symbols --with-tcl=/c/src/tcl8.6.11/win --prefix=/c/bin/tcl8.6.11 --exec-prefix=/c/bin/tcl8.6.11 LIBFFI_LIBS=/c/src/out/lib/libffi.a LIBFFI_CFLAGS="-IT:/c/src/out/include -DFFI_BUILDING"
make install

Win32 dll
Ffidl0.8

Although I could build it, it crashes the host application.
Don't use it.
Consider building Ffidl0.9 with MSVC.

Build configuration for TclSQLite with SQLite3MultipleCiphers

Prerequisites

C compiler = gcc version 10.2.0 (Rev6, Built by MSYS2 project)
Tcl build path = /c/src/tcl8.6.11/win
Tcl install path = /c/bin/tcl8.6.11
SQLite3 build path = /c/src/sqlite-autoconf-3340100/tea
SQLite3MultipleCiphers 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 with SQLite3MultipleCiphers

Copy the files in (SQLite3MultipleCiphers source path) to (SQLite3 build path)/generic.
Open tclsqlite3.c and replace "sqlite3.c" by "sqlite3mc.c" in the line #4.

cd (SQLite3 build path)
./configure --enable-threads --prefix=(Tcl install path) --with-tcl=(Tcl build path) CFLAGS="-DCODEC_TYPE=CODEC_TYPE_AES128 -DSQLITE_USE_URI -msse4.2 -maes"
make install

Other notes

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"

References

暗号化APIを有効にしたSQLite3のTclバインディングをコンパイルする

TkBLT Windows binaries

This is binary build of William Joye's TkBLT.

Latest build

TkBLT v3.2.22

How to build

32bit

./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

64bit

./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.

  • C:\msys64\mingw32\i686-w64-mingw32\lib\libpthread.dll.a
  • C:\msys64\mingw32\lib\gcc\i686-w64-mingw32\7.3.0\libstdc++.dll.a

Tcl patchlevel insensitive patch

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.

Archives

TkBLT v3.2.21

TkBLT v3.2.20

TkBLT v3.2.17

TkBLT v3.2.14

TkBLT v3.2.13

TkBLT v3.2.10

TkBLT v3.2.9

最新Tclkit事情

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

WiresharkにHSMS dissectorを追加したいので参考資料を集める

半導体製造装置とホストとの間の通信にはSEMI Standardで標準化されているHSMS-SS/SECS-IIというプロトコルが使われるのが一般的なのだが、このデバッグツール類はお高いものが多い。Wiresharkにも専用のdissectorはついてないので、自分でプラグインを書くか、サードパーティのdissector pluginを探すしかない。dissectorはDLLまたはLuaスクリプトとして追加できるらしい。

Wireshark Developer’s Guide

How can I add a custom protocol analyzer to wireshark? - StackOverflow

問題児たちがwiresharkのdissectorをLuaで書くそうですよ? - 迷い庭

というか、ここに古いpluginのソースコードが置いてあった。
Bug 8879 - HSMS protocol dissector plugin bug
古くて動作はしないけど、参考にはなりそう。ただ、今はLuaで書いたほうがいいんだろうか。

NativeアプリとManaged DLLの橋渡しをするMixed mode assembly

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#を選ぶかというところですな。

tclkitの仲間

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をVisual Studio 2012でビルドする

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関連のモジュールが大量にビルド失敗しますが、使わない限りは問題ありませんでした。