LinuxでもSwift

投稿者: | 2017年3月14日

さて、前回までに作ったCalendarDateクラスConditionクラスに加えて、mkpassで作ったDevicesクラスを組み合わせてdatecountを書き直します。ただ書き直すだけでは能がないので、任意の日付からの計算ができるようにしてみました。(現状は今日の日付に対して前後の日付を計算しています)

datecountのメインコードはGitHub上に置いてあります。

MakefileをマルチOS対応する

で、表題のLinux。Swift3になってからLinuxにもSwiftが提供されています。てことはコンパイルしなおせばLinuxでもdatecountが動くということ。すでに現バージョンをRaspberry Pi上でコンパイルして、動作することは確認済みです。ただしコンパイルコマンドがちと違う。ということでMakefileをmacOSとLinuxの両方に対応させましょう。

all:
	cp -p datecount.swift main.swift
ifeq ($(shell uname),Linux)
	swiftc -o datecount main.swift ./Devices/Devices.swift ./Condition/Condition.swift ./CalendarDate/CalendarDate.swift
else
	xcrun -sdk macosx swiftc -o datecount main.swift ./Devices/Devices.swift ./Condition/Condition.swift ./CalendarDate/CalendarDate.swift
endif
	rm main.swift

macOSもRaspbianもGNU makeが標準っぽい。条件分岐はifeq()~else~endifで記述します。

OS判定はどちらもunixコマンドが使えるのでunameの出力を見て判断します。ifeq()の条件判断節内で$(shell hogehoge)とすると、hogehogeコマンドの実行結果を取ることができ、makeコマンドはこれと”,”以降の内容を比較して真ならifeq節を、偽ならelse節を実行します。

macOSはxcrunコマンド経由でswiftcを、Linuxでは直接swiftcを呼び出しているため、ここを使い分けるようにしました。ちなみにmacOS判定をするときはunameの出力はDarwinになります。

SwiftファイルをマルチOS対応する

本来ならこれでARMプロセッサ用Linuxで動作するdatecountがコンパイルできるはずですが、DevicesクラスファイルにmacOS専用コードが書き込まれているためエラーになってしまいました。なのでソースコードもコンパイル時条件分岐をさせるようにしましょう。#if~#else~#endifで記述します。

#if os!(Linux)
〜 import Cocoaを含むPasteboadクラスのコード全体 〜
#endif

今回はmacOS用コードを外すだけなのでelse節は不要。こんな感じになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です