Ubuntu の Swift バージョンを Toolchain みたいに切り替えられるようにする

Server Side Swift

先日に Linux で Swift を使えるようにしてみましたけど、いざ使い始めてみると Swift のバージョンを柔軟に切り替えられた方が何かと都合が良さそうに思えてきたので、それがしやすい環境を整えてみることにしました。


以前に こちら で記したように Ubuntu でオープンソースの Swift を使えるようにしてみましたけど、いざ使い始めてみると Swift のバージョンを柔軟に切り替えられた方が何かと都合が良さそうに思えてきたので、それがしやすい環境を整えてみることにしました。

直接インストールした Swift を削除

以前は /usr/bin などに直接 Swift をインストールしましたが、今回はバージョンごとに別々のフォルダーに入れて管理しようと思うので、まずは念のため以前に入れた Swift に関連するファイルを削除しておくことにしました。

ただ、以前に自分がインストールした swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu14.04 の構成ファイルを見てみると Swift と合わせて /usr/include/lldb/usr/lib/python2.7/usr/bin/lldb といったものも含まれていたので、もしかすると余計なものも削除してしまうかもしれません。

調べてみた感じでは、少なくとも今回の こちら で用意した ConoHa VPS + Ubuntu 14.04 環境をインストールした直後にこれらのファイルは存在しなかったので、Swift Latest Development Snapshot (February, 08, 2016) をダウンロードしたディレクトリ内で次のコマンドを実行して全てを削除しておきました。

tar tzf swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu14.04.tar.gz | sed -n -e 's/^[^\/]*\(.*[^\/]\)$/\1/p' | while read line; do rm -vf $line; done

ちなみに今回の捜査で削除したファイルは files.swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu14.04.txt です。

Swift をインストールする

そうしたら、Swift をインストールする環境を整えます。Linux でのインストール方法が Swift.org - Download Swift に詳しく載っていたので、それを参考にしながら改めて Swift のインストールを行ってみます。

ライブラリのインストール

まず、必要なライブラリをインストールします。公式ドキュメントの説明にある clang をインストールしようとしたら、次のようなエラーが発生したので、手順を少し変えてインストールしてみます。

The following packages have unmet dependencies:

clang : Depends: clang-3.4 (>= 3.4~rc3-1~) but it is not going to be installed

E: Unable to correct problems, you have held broken packages.

最初に clang-3.4 をインストールすると上手く行く様子でしたけど、swift/README.md には Ubuntu 14.04 では clang-3.6 が必要 みたいに書いてあったので、次のようにして必要なライブラリをインストールしました。

sudo apt-get install clang-3.6

sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100

sudo apt-get install libicu-dev

スナップショットのインストール場所を作成

そして、Swift のスナップショットをインストールするディレクトリを作成します。今回は /toolchains ディレクトリを作成することにします。

mkdir /toolchains

スナップショットをインストール

スナップショットを入れる場所ができたら、必要なスナップショットを Swift.org - Download Swift からダウンロードします。

今回は次のようにして /usr/local/src にスナップショット Ubuntu 14.04 Swift Development Snapshot (February 25, 2016) をダウンロードして、それを展開するときに /snapshots にインストールすることにします。

wget https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a/swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a-ubuntu14.04.tar.gz
tar xvzf swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a-ubuntu14.04.tar.gz -C /toolchains

スナップショットへのパスを登録する

スナップショットを /toolchains にインストールできたら、それを使って Swift プログラムを実行できるようにします。

後で別のバージョンに切り替えやすいように、まずは使用するスナップショットを指すシンボリックリンクを /toolchains/swift-current という名前で作っておきます。

cd /toolchains

ln -s swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a-ubuntu14.04 swift-current

そして ~/.bash_profile を作成して、そこに次の内容を追記します。

export SWIFT_BIN="/toolchains/swift-current/usr/bin"
export SWIFT_LIB="/toolchains/swift-current/usr/lib"

export PATH="${SWIFT_BIN}":"${PATH}"
export LD_LIBRARY_PATH="${SWIFT_LIB}":"${LD_LIBRARY_PATH}"
export LD_RUN_PATH="${SWIFT_LIB}":"${LD_RUN_PATH}"

そうしたら、あとは次のようにして ~/.bash_profile の内容を反映します。

source ~/.bash_profile

完成

これで /toolchains/swift-current からリンクを貼った Swift のスナップショットを使えるようになりました。バージョンを切り替えたい時は、シンボリックリンクを作り直すだけで対応できます。

シンボリックリンクを貼り替えるスクリプト

切り替えたいときにシンボリックリンクを消して ln -s で作るのも面倒なので、それを行うスクリプトを作成してみました。

#!/bin/sh

SWIFT_CURRENT="swift-current"
TOOLCHAIN="$1"

if [ "${TOOLCHAIN}" != "" ]
then
        rm -f "${SWIFT_CURRENT}"
        ln -s "${TOOLCHAIN}" "${SWIFT_CURRENT}"
else
        echo "usage: $0 TOOLCHAIN"
fi 

これを /toolchains/select という名前で保存して、次のようにして実行権限を与えておきます。

chmod +x /toolchains/select

このようにすることで、たとえば /toolchains ディレクトリ内から次のコマンドを実行して、使用する Swift を切り替えられます。

./select swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a-ubuntu14.04