Xserver X10 上ではとりあえず Swift を動かせませんでした。

Web Server

レンタルサーバー Xserver で Swift が使えたらいいなと思って挑戦してみたのですけど、サポートされていない OS もあって、とりあえず不安要素がたくさんなので断念しました。


レンタルサーバー エックスサーバー の X10 プランでは SSH 接続して、ユーザー権限でならプログラムをインストールできる様子だったので、もしかして Swift コンパイラーをインストールできないか試してみました。

結果としては OS 環境の影響で Swift コンパイラーがエラーとなって、使えませんでしたけど。

Xserver X10 の環境

この環境が常に保証されているのかはわからないのですけど、とりあえず、公式のコントロールパネルから確認できたサーバー環境は次の通りです。

項目 内容
CPU Xeon E5-2640 v4 2.40GHz (Dual)
Memory 192GB
OS Linux

共用サーバーなのでこの環境をすべて享受できるわけではないですけれど、けっこう良い感じの性能ですね。OS は Linux とだけ記されていて、どのディストリビューションかは記されていませんでした。

Linux の種類

Swift の動作環境は Ubuntu なので、Xserver で採用しているディストリビューションを知りたいところだったのですけど /etc ディレクトリーが見られないため、すぐには確認できませんでした。

そのほかの確認方法を知らなかったので、とりあえず dmesg コマンドでログを眺めてみたところ、次のようなログが見つかったので、どうやら Red Hat 4.8.5 みたいです。

Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP

Swift は、実用的には動かせず

Linux のディストリビューションが Ubuntu ではなかったものの、もしかしたら動くかなと思って試してみたのですけど、うまく動かすことはできませんでした。

簡単な Swift コードは実行できたのですけど、ライブラリーとして Glibc をインポートしたコードだと、次のエラーが発生してしまいます。

error: header '///usr/include/x86_64-linux-gnu/sys/ioctl.h' not found

header "///usr/include/x86_64-linux-gnu/sys/ioctl.h"

^

<unknown>:0: error: could not build Objective-C module ‘SwiftGlibc'

動かせるコードはあるものの、初歩的な Glibc をインポートするところで躓くのもそうですし、非公式環境では今後のバージョンアップ次第では対応しなくなったりするのも不安だったので、今回は早々に諦めましたけど、せっかくなので Xserver に Swift をインストールするところまでの手順を、記しておこうと思います。

swiftenv のインストール

今回は swiftenv を使って Swift をインストールすることにしました。インストール手順は公式の通りです。

まずは GitHub から swiftenv を ~/.swiftenv にインストールします。

git clone https://github.com/kylef/swiftenv.git ~/.swiftenv

これで必要なファイルはインストールできたので、あとはこれを使えるようにします。Xserver のシェルは bash だったので、次の内容を ~/.bash_profile に追記します。

# swiftenv

export SWIFTENV_ROOT="$HOME/.swiftenv"
export PATH="$SWIFTENV_ROOT/bin:$PATH"
eval "$(swiftenv init -)"

そうしたら、次のようにして、現在のシェルに設定を反映させます。

source ~/.bash_profile

Swift のインストール

swiftenv をインストールできたら、次のようにして Swift をインストールします。

swiftenv install https://swift.org/builds/swift-3.0.2-release/ubuntu1404/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-ubuntu14.04.tar.gz

ここで指定しているパスは Swift のダウンロードページ にある Ubuntu 14.04 用の 時点での最新版です。結局は安心して使えませんでしたけど、とりあえず 16.04 用は、インストール後に swift コマンドを使うとすると次のエラーで動いてくれませんでしたので、入れるとしたら 14.04 用になるようです。

swift: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by swift)

swift: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by swift)

swift: /lib64/libtinfo.so.5: no version information available (required by swift)

ライブラリー周りでエラー

ただ、インストールした Swift を使おうとすると、次のエラーが発生してしまいます。

swift: error while loading shared libraries: libedit.so.2: cannot open shared object file: No such file or directory

これについて解決策をインターネットで調べてみたところ 既存のライブラリーからシンボリックリンクを貼れば良い という情報が出てきました。ライブラリーの後ろの番号ってバージョン番号みたいなので、さすがに力技すぎるんじゃないかと思うのですけど。

mkdir ~/lib

ln -s /lib64/libedit.so.0.0.42 ~/lib/libedit.so.2
ln -s /lib64/libicuuc.so.50.1.2 ~/lib/libicuuc.so.52
ln -s /lib64/libicui18n.so.50.1.2 ~/libicui18n.so.52

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/lib
export LD_LIBRARY_PATH

そう思いながらも試してみると、とりあえず swift コマンドを使って簡単なコードを実行できるようにまではなりました。

ただ、先ほどにも記したように Glibc をインポートしたコードはエラーになってしまいます。Linux プラットフォームだと Glibc は大事になってきそうですし、そもそもライブラリーのバージョン番号を無視してシンボリックリンクを貼っているところが、付き合いにくい誤動作を生む可能性が高すぎるので、今回はこのくらいで断念しておくことにしました。

swiftenv のアンインストール

さて、断念して使わなくなった swiftenv のアンインストールについても記しておきます。

swiftenv 本体のアンインストール

swiftenv に関するファイルは全て ~/.swiftenv にインストールされているので、次のようにしてそれらを削除します。

rm -fr ~/.swiftenv

環境設定の削除

今回は swiftenv を実行するための環境設定を ~/.bash_profile に記載したので、それらも削除しておきます。

また、設定を反映した影響で SWIFTENV_ROOT 環境変数が登録された状態なので、それらも次のようにして削除しておきます。

unset SWIFTENV_ROOT

ライブラリーのシンボリックリンクを削除

今回は、ライブラリー周りの調整のために ~/lib ディレクトリーを作ってそこにシンボリックリンクを貼ったので、これらも削除しておくことにします。

今回の自分の環境では、最初は ~/lib ディレクトリーが存在していなかったので、次のように丸ごと全部削除しました。もしも最初からこのディレクトリーが存在していた場合には、今回登録した 3 つのシンボリックリンクだけを削除するようにします。

rm -rf ~/lib