開発言語SwiftをLinuxでビルドしてみる
なんと2020年9月に入ってからSwiftがWindowsでも扱えるようになったようですね。
https://swift.org/blog/swift-on-windows/
というわけで今回は久しぶりに開発言語の話です。
もちろんゲイツ嫌いな筆者はWindowsではなく、LinuxでSwiftを実行していきます。
以前の投稿では単純にLinux上でSwiftのスクリプトベースでの実行について紹介しました。
そこで今回はそのSwiftのプログラムをUbuntuLinux上でバイナリへビルドする方法について紹介します。
まずは、適当にフォルダを作成し、ディレクトリに入ります。
$ mkdir swifttest
$ cd swifttest
次に以下を実行します。
$ swift package init --type executable
すると以下のメッセージが表示され、ファイルやフォルダが勝手に作成されます。
Creating executable package: swifttest
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/swifttest/main.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/swifttestTests/
Creating Tests/swifttestTests/swifttestTests.swift
Creating Tests/swifttestTests/XCTestManifests.swift
作成後はコーディングをしていくのはSources/swifttest/main.swiftのファイルになります。
これを中身をviエディタで開きます。
$ vi Sources/swifttest/main.swift
すると既にHello,Worldが記載されたファイルとなっています。
print("Hello, world!")
これに若干手を加えて以下のようにしてみます。
print("Hello, world!")
let apple = 123
let orange = 234
print("apple + orange = ",apple + orange)
これをビルドするには作成したswifttest直下のディレクトリで以下コマンドを実行します。
$ swift build
するとビルド開始され、以下が標準出力に表示されます。
[4/4] Linking swifttest
ビルドが完了すると以下のディレクトリにバイナリファイルが格納されますので実行してみましょう。
$ ./.build/debug/swifttest
無事に以下が出力されると思います。
Hello, world!
apple + orange = 357
※Linux上でビルドしたバイナリファイルはmacOSXでは動作しません。
macOSXで動作させるには同一コードをmacOSX上でビルドする必要があります。これはWindows版でも同様かと思います。
尚、Package.swiftの中身は以下となり、こちらでビルドに必要な名前やディレクトリ名が定義されています。
仮にフォルダ名やファイル名を変更する場合、このPackage.swiftも合わせて編集しないとビルドが行えなくなってしまいます。
// swift-tools-version:5.2
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "swifttest",
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "swifttest",
dependencies: []),
.testTarget(
name: "swifttestTests",
dependencies: ["swifttest"]),
]
)