Jenkinsを使ってPerforceのdepotからtrunkを取ってきて、UnityアプリのiOS版のビルドをしているのですが、あるときからXcodeでのビルド時にリンクエラーになるようになってしまいました。同じコードベースのAndroid版は問題なし。
ld: framework not found GoogleMobileAds
P4Vでdepotを見ると、確かにフレームワークが無い。でも、なぜかリンク対象になってる。で、Mac内のワークスペースを見ると、なぜかフレームワークがある。でも、中身が無い。…そうか!!
iOS(Mac)のフレームワークはMac上では単一のファイルのように見えますが、実際には複数のファイルをまとめたフォルダです。で、不要になったので誰かが削除したんですが、Perforceはフォルダを管理しないので、フレームワーク内のファイルは消されたものの、ローカルにフォルダは残ったままになります。(上記のスクショはファイルがある状態)
で、UnityはAssetsフォルダ内にあるフォルダやファイルを自動的にプロジェクトに登録してしまうので、フォルダの名前(.framework)だけを見てフレームワークであると認識し、中身が無いにもかかわらず登録してしまい、リンクエラーになるわけです。
まとめると、
- SDK外のフレームワークを取り込んで使っていた
- 不要になったので関連するファイルを削除した
- iOS(macOS)のFrameworkはフォルダベース
- Perforceはファイルしか管理しないのでフォルダだけが残った
- Unityがフォルダの存在だけを見て自動的にリンク対象にした
- でも中身が存在しないのでリンクエラー
ということでした。対応策は、
- Workspaceの設定のAdvancedの"Rmdir: delete workspace directories when empty"にチェックを入れる。
- JenkinsのP4PluginのOptionsの"RMDIR"にチェックを入れる。
…というところなんですが、一つ問題があって、UnityはAssets内のフォルダやファイルを自動的にプロジェクトに登録する際に、.metaファイルを作ってしまいます。そうなると、フォルダ内にフォルダがある場合は空にならないので削除されません。"Forced"でdepot全体を取り直すか、手作業でフォルダを削除するしかなさそうです。