はじめに
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
にパスを通しておきます。
ソースからのコンパイルは気持ちがいい。