Ubuntu Weekly Recipe

第401回 オープンソース化されたApple Swiftでこのは弄り

この記事を読むのに必要な時間:およそ 11.5 分

アップルが開発しているプログラミング言語であるSwiftオープンソース版が公開されました。今回はこのSwiftをUbuntu上で利用する方法を紹介します。

アップルさん家のSwift

「アップルさん家の」Swiftは,iOSやOS Xのソフトウェアを開発するために2014年に発表された比較的新しいプログラミング言語です。今年の6月には,その新しいバージョンであるSwift 2をオープンソース化することが発表されていました。オープンソース版の公開に伴ってGitHub上にもプロジェクトページが作成され,さっそくたくさんのPull Requestがマージされているようです。

このオープンソース版Swiftの最大の特徴は「Linuxでも動く」ということです。もともとiOS/OS X用のソフトウェア開発用に作られたこともあって,当初はOS X向けの開発環境のみが提供されていました。今回オープンソース版を開発するにあたって,より多くのプラットフォームで動くようにすべくLinuxへのポーティングが行われたようです。ライセンスはApache Licenseですので,そのうちパッケージリポジトリから簡単にインストールできるようになるかもしれません。

詳しいことはThe Swift Linux Portにも説明がありますが,現時点でその動作にはかなり制約があります。まず最初に,Objective-Cランタイムは使えません。Foundationモジュールを経由して利用できるAPIのうち,Objective-Cに依存するものは使えないということになります。さすがにデータ構造などプリミティブなものはObjective-Cの依存を排除することでLinuxでも使えるようになっているものの,インターネットで公開されているサンプルコードのほとんどはLinux版では動かないと思ったほうがいいでしょう。

また,Linux版のXcodeはありません。XcodeはiOS/OS X向けの統合開発環境であり,Swift/Objective-Cのコード編集はもちろんのこと,UI作成のためのInterface Builderや対話的な実行環境であるPlayground,テストツールなどの機能が搭載されています。SwiftをプログラミングしてコンパイルするだけであればXcodeはなくてもかまわないのですが,さまざまなサードパーティのライブラリやドキュメントが,Xcodeを前提にしたインストール方法を紹介しているため,Linuxでそれらのライブラリを導入したい場合に苦労することになるでしょう。

今のところLinux版のSwiftは,⁠Swiftというプログラミング言語の学習用」以外の用途に使おうとすると,数多くの障害が立ちはだかると思っておきましょう※1)⁠

※1
今回のオープンソース版は基本的な機能に留まっていますが,来年春に予定されているSwift 2.2のリリースまでにはもう少し状況が変わっているかもしれません。また,Swift Package Manager対応のモジュールが増えてくれば,外部モジュールのインストールもLinuxでも簡単になるものと思います。さらにその先のSwift 3.0では,今回のマルチプラットフォーム対応も踏まえた大きな変更を予定しているようなので,さらにLinuxでも使いやすくなる可能性があります。

Swiftのインストール方法

UbuntuにSwiftをインストールする方法はいくつか存在します。

  • バイナリアーカイブをダウンロードする
  • ソースコードからビルドする
  • Dockerを使う
  • Ubuntu Makeを使う(12月7日時点では未実装)

サポートプラットフォームは,64bit版のUbuntu 14.04 LTSないしUbuntu 15.10となっています。今回はUbuntu 14.04 LTSを対象に,それぞれのインストール方法を個別に紹介しましょう。

バイナリファイルをインストールする

Swiftを試す上で,一番簡単かつ確実に動作する方法です。ただしバイナリファイルは2015年12月6日時点でSwift 2.2の開発版の12月1日のスナップショットになっています。つまりオープンソース版として告知される直前の少し古いバイナリです。今後定期的にバイナリは更新されるものと思いますが,最新版を使いたい場合は次のソースコードからビルドする方法を参照してください。

バイナリファイルはダウンロードページからダウンロードできます。また同じページにLinuxでのインストール手順もありますので,それを元にインストールしましょう。手順としては依存するバイナリパッケージをUbuntuの公式リポジトリからインストールした上で,ダウンロードしたファイルを任意の場所に展開し,その場所を実行ファイルの検索パスに追加するだけです。特にシステムファイルを書き換えるようなことはしませんが,もし不安であればLXCなどの仮想環境上で実行すると良いでしょう。

まずはバイナリアーカイブとその署名ファイルのダウンロードです。ファイル名の日付部分は将来的に変わるかもしれませんので,適宜適切な値をダウンロードページで取得してください。

$ wget https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ wget https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz.sig

手順ではこのあと署名ファイルを使って,ファイルを検証することを「強く推奨」しています。そこでGPGを使って署名を検証する方法も説明しておきましょう。まず検証するためには,署名した人の公開鍵(Public Key)を鍵サーバーから取得する必要があります。取得しない状態で検証すると,以下のように「public key not found」と表示されます。

$ gpg --verify swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz.sig
(中略)
gpg: Signature made 2015年12月03日 06時23分10秒 JST using RSA key ID 412B37AD
gpg: Can't check signature: public key not found

この鍵ID「412B837AD」を鍵サーバーで検索すると,次のように署名した人の名前(User ID)などが表示されます。

$ gpg --keyserver hkp://pool.sks-keyservers.net --search-keys 412B37AD
gpg: searching for "412B37AD" from hkp server pool.sks-keyservers.net
(1)     Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>
          4096 bit RSA key 412B37AD, created: 2015-11-19, expires: 2017-11-18
Keys 1-1 of 1 for "412B37AD".  Enter number(s), N)ext, or Q)uit > q

上記のようにこの鍵IDは「Swift Automatic Signing Key」の公開鍵であることがわかります※2)⁠

※2
User IDはその公開鍵を作成し,鍵サーバーにアップロードした人が自由に設定できる値です。また鍵サーバーには誰でも自由に任意の鍵をアップロードできます。つまりその鍵IDで指定した鍵が本当にUser IDの人のものなのかどうかは別の手段で確認する必要があります。今回はHTTPS経由でアクセスしたウェブページで書かれている鍵IDを使うので「おそらく改ざんされていないだろう」という判断のもとにその鍵を信用しています。これはPPAのリポジトリ追加時に行っていることと大差ありません。

今回はこのままインポートするわけではないので,⁠q」を入力して終了してください。手順では,⁠gpg --recv-keys」コマンドか「gpg --import」コマンドで2つの鍵を取り込んでいます。ここでは「gpg --recv-keys」の手順を行ってみましょう。

$ gpg --keyserver hkp://pool.sks-keyservers.net \
      --recv-keys \
      '7463 A81A 4B2E EA1B 551F  FBCF D441 C977 412B 37AD' \
      '1BE1 E29A 084C B305 F397  D62A 9F59 7F4D 21A5 6D5F'
gpg: requesting key 412B37AD from hkp server pool.sks-keyservers.net
gpg: requesting key 21A56D5F from hkp server pool.sks-keyservers.net
gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created
gpg: key 412B37AD: public key "Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>" imported
gpg: key 21A56D5F: public key "Swift 2.2 Release Signing Key <swift-infrastructure@swift.org>" imported
gpg: Total number processed: 2
gpg:               imported: 2  (RSA: 2)

先ほどの「Swift Automatic Signing Key」だけでなく「Swift 2.2 Release Signing Key」の公開鍵も取り込みました。ちなみにコマンドではより確実に特定の鍵を取り込むために,鍵のフィンガープリントを指定していますが,フィンガープリントの末尾である鍵IDを指定してもかまいません。

取り込まれた鍵のリストを表示してみましょう。

$ gpg --list-keys
/home/ubuntu/.gnupg/pubring.gpg
-------------------------------
pub   4096R/412B37AD 2015-11-19 [expires: 2017-11-18]
uid                  Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>

pub   4096R/21A56D5F 2015-11-28 [expires: 2017-11-27]
uid                  Swift 2.2 Release Signing Key <swift-infrastructure@swift.org>

取り込んだ鍵を使って,ファイルの署名を検証しましょう。

$ gpg --verify swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz.sig
gpg: Signature made 2015年12月03日 06時23分10秒 JST using RSA key ID 412B37AD
gpg: Good signature from "Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7463 A81A 4B2E EA1B 551F  FBCF D441 C977 412B 37AD

「Good signature」と表示されているので,確かにダウンロードしたファイルは「Swift Automatic Signing Key」の秘密鍵を持っている人が署名を行ったファイルのようです。

ちなみに「WARNING」は,公開鍵そのものが署名されていないことを伝えています。本来,取り込んだ鍵が本当に妥当なものであるのならば,公開鍵ファイルに取り込んだあとにユーザー自身がその鍵に署名を行うべきです。今回は一時的な使用なので,このステップをスキップしています。ちなみに公開鍵ファイルから,特定の鍵を削除したい場合は,次のように実行してください。

$ gpg --delete-keys 412B37AD
(中略)
pub  4096R/412B37AD 2015-11-19 Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>

Delete this key from the keyring? (y/N) y
$ gpg --list-keys
/home/ubuntu/.gnupg/pubring.gpg
-------------------------------
pub   4096R/21A56D5F 2015-11-28 [expires: 2017-11-27]
uid                  Swift 2.2 Release Signing Key <swift-infrastructure@swift.org>

さて,GPGによるダウンロードしたファイルの検証が終わったので,次にファイルを展開しましょう。展開先はどこでもかまいません。以下では,展開したあとにディレクトリ名を「swift」に変更しています。

$ tar xvf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ mv swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04 swift

展開したディレクトリの「usr/bin」を検索パスに追加し,swiftコマンドを実行してみましょう。

$ export PATH=`pwd`/swift/usr/bin:${PATH}
$ which swift
/home/ubuntu/swift/usr/bin/swift
$ swift --version
Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c)
Target: x86_64-unknown-linux-gnu

上記のようにバージョンが表示されればインストール完了です。

ちなみにswiftcコマンドを使う場合,clangとbuild-essentialパッケージが必要です。

$ sudo apt-get install clang build-essential

特に後者をインストールしていない場合,次のようなエラーが表示されます。

$ swiftc foo.swift
clang: error: unable to execute command: Executable "ld" doesn't exist!
clang: error: linker command failed with exit code 1 (use -v to see invocation)
<unknown>:0: error: link command failed with exit code 1 (use -v to see invocation)

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

  • ソースコードからビルドの REPL

    build-script に --preset=buildbot_linux_1510、installable_package と install_destdir を指定してビルドすると REPL が使える swift (実体は lldb repl) tar ball ができます。Ubuntu 15.10 でうまく行っています。

    Commented : #1  杉田研治 (2015/12/14, 17:32)

コメントの記入