はじめに
Tkを使うとクロスプラットフォームなGUIアプリケーションを簡単に作ることができます。Tclの人気はいまひとつですが,Tkはさまざまな言語のバインディングがあり,いい意味で枯れたGUIツールキットとして広く使われています。
Tkのtutorialには,同じアプリケーションがTk,RubyTk, Tkinterで書かれています。PythonにはTkinterがついてくるのですが,wishやtclshは見当たらないので,インストールすることにしました。
Tcl/TkはActiveTclのバイナリやパッケージ管理システムのものをインストールすることが多いと思いますが,Windows 10でソースからコンパイルしてみることにしました。Tkのコンパイルにつまづいたので,やりかたをまとめておきます。
追記 2019/6/22
- パスの誤りなどを修正しました。
- Visual Studio 2019でやってみました。
- x64_x86 Cross Tools Command Prompt for VS 2019でx86バイナリの作成ができました。
C:\Users\takeshi\Downloads\destroot\bin>dumpbin /headers wish86t.exe | findstr machine
             14C machine (x86)
                   32 bit word machine
Windows 10 SDK
Tcl-8.6.9は[How to Compile Tcl]のとおりにやればコンパイルが通ります。Tk-8.6.9のコンパイルが通るのは,Windows SDK 10.0.15063.0までです。TclとTkとでSDKのバージョンが違うとTkのリンクに失敗します。そこで,コンパイルに取り掛かる前にSDKを準備します。Tcl/Tk-8.6.9時点での情報です。それ以降のバージョンでは,古いSDKのインストールは不要かもしれません。
インストール
Visual Studio Installerを起動します。インストーラ自身やインストールされているものの更新が始まるかもしれません。
- Visual Studio Community 2017の「変更」ボタンをクリックします。
- 「ワークロード」タブの「C++によるデスクトップ開発」にチェックを入れます。
- 「インストールの詳細」の「C++によるデスクトップ開発」から「Windows 10 SDK (10.0.15063.0)」にチェックを入れます。
- 「ダウンロードしながらインストールする」あるいは「全部ダウンロードしてからインストールする」を選択してクリックします。
SDKの選択
スタートメニューから「Visual Studio 2017」を開いて「開発者用コマンドプロンプト」を実行します。varsall.batのあるディレクトリに移動します。
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
Building with Visual Studio 2017にある通り,バッチvarsallを実行します。
vcvarsall x64 10.0.15063.0 
x86用のバイナリを作るときはx64の代わりにx86とします。
Tcl/Tkのコンパイル
- tcl869-src.zipをダウンロードして展開します。
- インストール先INSTALLDIRを決めます。なければ作成します。私はAppData\Local\Programs\Tclにしました。
- 
tcl869-src\tcl8.6.9\winに移動してコンパイル・インストールします。
> nmake -f makefile.vc INSTALLDIR=path_to_your_install_dir
> nmake -f makefile.vc install INSTALLDIR=path_to_your_install_dir
- 
tk869-src\tk869\winに移動してコンパイルします。TCLDIRはTclのソースを指定します。上の例ではtcl869-src\tcl8.6.9です。
nmake -f makefile.vc INSTALLDIR=path_to_your_install_dir TCLDIR=path_to_tcl_source
nmake -f makefile.vc install INSTALLDIR=path_to_your_install_dir TCLDIR=path_to_tcl_source
- 必要に応じてtclsh86t.exeをtclsh.exeにwish86t.exeをwish.exeに改名します。
- 
TCLDIR\binにパスを通しておきます。
ソースからのコンパイルは気持ちがいい。