Xcodeを開かずにOpenSiv3Dを使いたい

この記事は[Siv3d Advent Calendar 2019](https://qiita.com/advent-calendar/2019/siv3d) 20日目の記事です。

#はじめに

Mac版のOpenSiv3DはXcodeが推奨されています。ですが、Xcodeでコードを書くのは **個人的に**好きではないです。ですが私の力ではCMakeListsを書く事ができませんでした。
ただ基本的な事(プロジェクトを作成やコードを書く等)はXcodeを使いたくないなと思い、今回の記事を書かせていただきます。
Xcodeの力とか要らないし〜、てか俺vim派だし〜って方は18日目の[higashi000さん](https://qiita.com/higashi000/items/fcdf0af788e54acdc179)の記事をどうぞ。

#includeとlibを別のフォルダに格納する

[Siv3Dをはじめよう](https://siv3d.github.io/ja-jp/)でmac版のOpenSiv3Dがダウンロードできます。ダウンロードしたzipファイルを開くと下の画像のようにフォルダが入ってます。<img width="390" alt="1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327650/033081be-47b0-10c0-f3b4-294fd9c9a717.jpeg">
includeフォルダとlibフォルダにOpenSiv3DのHeaderやLibrary等が入っています。ですが、この2つのフォルダはそこまでではないですが少し重いです。毎回上記のサイトからダウンロードしたりするとやはり容量を食ってしまいます。という事で私は「/usr/local/OpenSiv3Dv0_4_2/」に2つのフォルダを格納しました。別にホームディレクトリに格納しても大丈夫です。

#Xcodeの再設定

includeとlibを別のフォルダに格納したので、もちろんXcodeでHeader Search PathsとLibrary Search Pathsの再設定をします。
<img width="632" alt="IncludeSearchPath_after.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327650/8f810e23-4d0a-e790-ac33-49cc1119b645.jpeg">
初期状態ではこのようになっています。このパスを、

<img width="536" alt="IncludeSearchPath.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327650/d4013ca0-d096-0699-b3f4-52cfff8f93e8.jpeg">
このように再設定します。つまり「../../」を全部「/usr/local/OpenSiv3Dv0_4_2/」に書き換えます。画像ではHeader Search Pathsしか表示されていませんが、下のLibrary Search Pathsも同じように書き換えます。

## 追記
Lukeさん(@Luke02561)からの情報で、
>この方法で試してみたのですが、ビルド時に
```error: The linked library '***.a' is missing one or more architectures required by this target: arm64.```
というエラーが大量に発生しました。一応解決はしたのですが、その方法が、
Project→Build Settings→Excluded Architecture
に「arm64」と追記することでした(参照:https://developer.apple.com/forums/thread/660782)

との事です。Lukeさん本当にありがとうございます！

#VScodeの設定

App等が入ってるフォルダの位置でVScodeを開きます。開いたらc_cpp_properties.jsonを以下のように書き換えます。

```c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "/usr/local/OpenSiv3Dv0_4_2/include",
                "/usr/local/OpenSiv3Dv0_4_2/include/ThirdParty",
                "/usr/local/include",
                "./src"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/System/Library/Frameworks",
                "/Library/Frameworks"
            ],
            "compilerPath": "/usr/local/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}
```

これでVScodeでOpenSiv3Dのインテリセンスが働くようになります。そもそもXcodeが嫌な理由としてインテリセンスが出るのが遅いという点がありました。

#VScode上でビルド＆実行する

上述した通り、私の力ではCMakeListsを書く事ができませんでした。という事でビルドと実行はXcodeに任せる事にしました。幸いMacはジェスチャが優秀なのでXcodeとVScodeの行き来が楽なので、VScodeでコーディングしてからXcodeでビルドをするという方法が最初に思い浮かびました。ただこのやり方は私的には不満です。Xcodeを開かずにビルドがしたいからです。

調べていくうちにターミナルで「xcodebuild」と打ち込むとビルドをしてくれるという事がわかりました。VScode上でターミナルを開き、

```
$ xcodebuild
```
と打ち込むとビルドが完了し、App/empty.appが作成されます。ちなみにこのempty.appを開くと実行する事ができます。

ということは、

```
$ xcodebuild && open App/empty.app
```
とターミナルに打ち込む事によってビルドしてから実行する事ができます。
私は毎回ターミナルに書くのがめんどくさいので、keybindings.jsonに以下のコードを追加します。

```keybindings.json
[
    {
        "key": "Cmd+b",
        "command": "workbench.action.terminal.sendSequence",
        "args": {
            "text": "xcodebuild \n"
        }
    },
    {
        "key": "Cmd+r",
        "command": "workbench.action.terminal.sendSequence",
        "args": {
            "text": "xcodebuild && open App/empty.app \n"
        }
    }
]
```
一応これでXcodeと同じコマンドでビルドや実行ができるようになります。ただしこれではプロジェクト名がemptyではなかった場合にビルドはできても実行はできません。なので、

```keybindings.json
[
    {
        "key": "Cmd+b",
        "command": "workbench.action.terminal.sendSequence",
        "args": {
            "text": "xcodebuild \n"
        }
    },
    {
        "key": "Cmd+r",
        "command": "workbench.action.terminal.sendSequence",
        "args": {
            "text": "xcodebuild && find . -name \*.app | xargs open \n"
        }
    }
]
```
という風に書けばプロジェクト名が変更されてても実行できるようになります。

こちらが実際にCommand+Rを押した時の動画です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiita用 <a href="https://t.co/WvOIH9FgOq">pic.twitter.com/WvOIH9FgOq</a></p>&mdash; mak1a (@mak1a_ctrl) <a href="https://twitter.com/mak1a_ctrl/status/1207635338400686085?ref_src=twsrc%5Etfw">December 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#バッチファイルを作成

実はここまでで記事を終わらせる予定だったのですが、このままでは正直実用性がないなと感じたのでもう少し改良していきます。

上記のVScodeを開いていたフォルダに.commandファイルを作成します。このファイルをダブルクリックする事により、その場所でVScodeを開けるようにします。

Appフォルダやsrcフォルダと同じ場所に「任意の名前.command」というファイルを作成します。作成したファイルに以下のコードを記述します。

```
#!/bin/bash
MY_DIRNAME=$(dirname $0)
cd $MY_DIRNAME
open -a Visual\ Studio\ Code .
```
これでXcodeのようにフォルダからダブルクリックで開けるようになりました。

#テンプレートの作成

ここから先はおまけで、上記の作ったテンプレートが欲しいなと思い、作成しました。

まず、テンプレートに使いたいプロジェクトを選びます。めんどくさかったら[ここ](https://siv3d.github.io/ja-jp/)からダウンロードしたやつで構いません。今回私はMain.cppのみのプロジェクトとRyoさんが作成してくださった[ゲームテンプレート](https://siv3d.github.io/ja-jp/sample/game-template/)のちょこっと改良版の2つをテンプレート化します。

##プロジェクトフォルダのzip化

まず、テンプレート化したいプロジェクトをzip化します。例えば今回templateSiv3D.zipというファイルを作成したとします。このzipファイルをターミナルから開く場合、__MACOSXや.DS_Storeが作成されてしまいます。なので、ターミナルで

```
$ zip --delete templateSiv3D.zip "*__MACOSX*" "*.DS_Store"
```
という風に打ち込んでください。作ったzipファイルは任意の場所に格納しておいてください。私は2つ作っているので、~/OpenSiv3D_Template/ にNomalとGameTemplateというフォルダを作成してその中にそれぞれ格納しています。

##シェルの設定

次にターミナルから作成したzipファイルを解凍し、VScodeを開くようにシェルを設定します。.bashrc(zshを使ってる人は.zshrc)に以下のコードを追加します。

```.zshrc
#OpenSiv3Dのテンプレート作成＆Appフォルダと同じ階層に移動＆VScodeを開く
function OpenSiv3D_nomal_template () {
  unzip ~/OpenSiv3D_Template/Nomal/v0_4_2.zip; ＃ <-上で作成したzipファイル
  mv ./v0_4_2 ./$1;
  open -a Visual\ Studio\ Code ./$1/examples/empty; ＃ <-Appフォルダと同じ階層
}

#OpenSiv3Dのゲームテンプレート作成＆Appフォルダと同じ階層に移動＆VScodeを開く
function OpenSiv3D_game_template () {
  unzip ~/OpenSiv3D_Template/GameTemplate/v0_4_2.zip; ＃ <-上で作成したzipファイル
  mv ./v0_4_2 ./$1;
  open -a Visual\ Studio\ Code ./$1/Game/Game; ＃ <-Appフォルダと同じ階層
}
```
引数を指定していますが、引数に入れた文字がフォルダの名前になります。実際にコマンドを実行した動画がこちらです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">その2 <a href="https://t.co/NjdeTqTSAp">pic.twitter.com/NjdeTqTSAp</a></p>&mdash; mak1a (@mak1a_ctrl) <a href="https://twitter.com/mak1a_ctrl/status/1207701483229044741?ref_src=twsrc%5Etfw">December 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これで一応テンプレートとして機能するようになりました。

#終わりに

とりあえずXcodeを開かないでOpenSiv3Dの開発ができるようになりました。今回書いていませんが、hppファイル等をVScodeで作成すると反映されますのでご安心を。