Windows上でSwiftの環境構築をする

2021年時点での情報です。

Swiftをインストールする手順をまとめます。

[Swift for TensorFlow](https://www.tensorflow.org/swift) (S4TFと略すらしいです) が気になって[^1]のでSwiftに入門したのですが、残念ながらS4TFは[アーカイブ](https://github.com/tensorflow/swift)されてしまいました。

[^1]: S4TFの紹介記事: 『[Swift for TensorFlowと新たなプログラミングモデル](https://qiita.com/Bigamition/items/fbde79cca10bd9cfacd4)』

S4TFのインストール手順も記念に残してあります。

まずWindowsでローカルにSwiftの環境を構築する方法としては以下のものがあります。

1. Windowsネイティブで構築する
2. WSL上で構築する
3. Dockerを利用する

1の方法はSwiftPMの[Windowsサポート](https://swift.org/blog/swift-5-4-released/#windows-platform-support)により現実的になってきています。
1の方法で環境構築したい場合は[Getting Started On Windows](https://swift.org/getting-started/#on-windows)を参照してください。

この記事では2の方法を解説します。
3の方法もWSLの場合と同じく[Dockerの環境をVS Codeで開ける](https://qiita.com/yoskeoka/items/01c52c069123e0298660)ようなのでLSPの設定の部分などある程度参考になると思います。

[VS Code](https://code.visualstudio.com/)は事前にインストールしておいてください。

# WSLの導入

これについては紹介している記事が多数あるので私が参考にした記事を紹介するだけにしておきます。

まず公式の[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#manual-installation-steps)に従ってWSLまたはWSL2をインストールしてください。
Swiftでサポートされるディストリビューションは [Download Swift](https://swift.org/download/) から確認できます。
迷ったらWSL2とUbuntuの最新LTSでいいと思います。

次に好みに合わせてセットアップしましょう。
Ubuntuなら『[Ubuntu 18.04 LTSのセットアップ](https://qiita.com/SUZUKI_Masaya/items/54cc17a42597733c87d1)』が18.04に限らず参考になると思います。

以上でWSLの準備は完了です。

## VS CodeとWSLの連携

VS CodeにWSLの拡張機能を入れておくとファイル操作やテキスト編集がGUIでできるようになります。
左のバーの一番下にある「田」のような形のマークをクリックすると拡張機能画面が現れます。
そこで「WSL」と検索して出てくる「Remote - WSL」をインストールしてください。
するとVS Codeのウィンドウの左下に「><」のようなマークが表示されるようになります。
そこをクリックし、「Remote-WSL: New Window」を選択するとWSLに接続したVS Codeを開くことができます。
また、WSL上で `code ${ファイル名}` と入力することでもVS CodeでWSLのファイルを開くことができます。

# Swiftのインストール

通常のSwiftのインストールとS4TFのインストールを順に解説します。

## 通常のSwiftのインストール

参考: [Installing Swift](https://swift.org/getting-started/#installing-swift)

エディタでSwiftコードの補完をするには [SourceKit-LSP](https://github.com/apple/sourcekit-lsp) が必要ですが、Swift 5.1以降で同梱されるようになったので、それ以降のバージョンをインストールすると仮定して進めます。

また、ここでは作業ディレクトリは `/home/${ユーザー名}/` としておきます。(『[UNIX系OSのディレクトリ構造表](https://qiita.com/uhooi/items/c1388f8d803641bfb8f3)』によると`/opt`以下にインストールするのが適切な気がしますが、パーミッションの話を回避するためにこの記事ではホームディレクトリにインストールします。)

まず[Getting Started On Linux](https://swift.org/getting-started/#on-linux)で指定されているコマンドを入力して依存ライブラリをインストールしてください。

次に「[Download Swift](https://swift.org/download/#releases)」から自分のOSに合ったSwiftをダウンロードします。

```bash
wget ${SwiftのダウンロードURL}
```

そして `Swift` ディレクトリを作成し、そこにダウンロードしたツールチェインを展開します。

```bash
mkdir swift
tar -zxvf ${ダウンロードしたファイル名} -C swift/
```

ダウンロードしたSwiftにパスを通しましょう。
ホームディレクトリにある `.bashrc` というテキストファイルがシェルの起動時に実行されるので、そこにパスを通すコマンドを追記し、シェルを再起動しましょう。

```bash
echo 'export PATH=/home/${ユーザー名}/swift/usr/bin:"${PATH}"' >> .bashrc
```

うまくいっていれば `swift --version` と入力すると現在のバージョンが表示されるはずです。(単に `swift` と入力すると本来はREPLが起動するようですが、WSL1ではうまく動作しません: [REPL not working on WSL 18.04 Ubuntu](https://github.com/tensorflow/swift/issues/142))

## S4TFのインストール

参考: [Install Swift for TensorFlow](https://github.com/tensorflow/swift/blob/master/Installation.md#install-swift-for-tensorflow)

GPUを利用する場合は予めCUDAとcuDNNをインストールしておいてください。
WSL2のみがGPUに対応していることに注意しましょう。
現在対応しているバージョンは次のようになっています。(https://github.com/tensorflow/swift/blob/master/Installation.md#linux)

* CUDA Toolkit 10.1, 10.2, or 11.0
* CuDNN 7.6.0 onwards (CUDA 10.1)

まず「[Install Swift for TensorFlow](https://github.com/tensorflow/swift/blob/master/Installation.md#install-swift-for-tensorflow)」からツールチェインをダウンロードし、パスを通すところまでは同様にします。

そして必要なものをインストールします。

```bash
sudo apt-get install clang libpython-dev libblocksruntime-dev
```

`swift --version` と入力し、うまくインストールされたか確認してください。
うまくいかない場合さらに[他の依存](https://github.com/apple/swift#linux)のインストールも必要かもしれません。

# VS CodeにSwiftの拡張機能を導入する

[公式の拡張機能](https://github.com/apple/sourcekit-lsp/tree/master/Editors/vscode)もあるようなのですが、今のところ利用するためにビルドが必要とのことなので「Maintained Swift Development Environment (SDE)」を利用することにします。

WSL Remoteのウィンドウを開き、拡張機能を「Swift」で検索するとSDEが出てくるのでInstall on WSLからWSLにSDEをインストールしてください。
これでSDEのインストールができたので、次はSDEの設定です。

`ファイル/基本設定/設定` から設定画面に入り、Swiftで検索すると出てくる項目から次のものを設定してください。

* Swift > Path: Swift_driver_bin (上記の手順でインストールしている場合 `/home/${ユーザー名}/swift/bin/swift`)
* Sde: Language Server Mode (sourcekit-lsp)
* Sourcekit-lsp: Server Path (上記の手順でインストールしている場合 `/home/${ユーザー名}/swift/bin/sourcekit-lsp`)

これでSwiftファイルを開くとSDEが機能するようになったはずです。

# おわりに

他にもVS CodeにGitの拡張機能を入れたり、タスクランナーを設定することでより快適にコーディングできるようになります。
Windows上で気持ちよくSwiftプログラミングをしましょう！