Macでcc65コンパイラを使えるようにした話

## 概要
　ファミコンプログラミングを始めたいと思ったけど、Macのターミナルの知識がほぼなく、ネットにある情報はWindowsのものばかりで苦戦しまい、結局どれが有効な手段だったのかよくわからなかったので時系列順に書いていきます。結果として、cc65コンパイラのコマンド（cc65, cl65, ld65など）をMacのターミナル上で動かせるようになりました。ちなみに、環境は以下のような感じです。
 - macOS Sonoma 14.1.1
 - cc64 v2.19

Qiitaの記事を書くのが初めてで、Gitやターミナルの知識も十分にないままこの記事を書いているので不適切な記述や言葉の使用があるかもしれませんが、ご了承ください｡(有識者の方、コメントで優しく補足・訂正してくださると嬉しいです！）
さっさとやり方だけ知りたい方は[結論](#結論)、および[Command Line Toolsのインストール](#command-line-toolsのインストール)と[PATHを通してコンパイラのコマンドを有効化する](#pathを通してコンパイラのコマンドを有効化する)の章をご覧ください。

## Command Line Toolsのインストール
　まず、[NES研究所](http://hp.vector.co.jp/authors/VA042397/nes/6502.html)さんの[サンプルのHello World!](http://hp.vector.co.jp/authors/VA042397/nes/sample.html)をコンパイルできるようにしたいと思いました。ここでぶち当たった壁は、まずcc65コンパイラをインストールできないというところ。[公式サイト](https://cc65.github.io/getting-started.html)のGNU/Linuxの欄にある、
 ```
 git clone https://github.com/cc65/cc65.git
 ```
 というコマンドが実行できませんでした。原因は、Gitが使えないことでした。ここは、ターミナルのCommand Line Toolsをインストールしてから、公式サイトで書いてあるようにGitでクローンし、それからインストールされたディレクトリに移動し(`cd cc65`)、`make`コマンドを実行することで、正しくファイルを揃えることができました。

## コンパイラの有効化
　今度こそできると思い、ターミナルでmakeコマンドを打ってmakefileを実行しようとすると、
 ```
 command not found
  ```
 と出てしまいました。ここでの問題は、makefileに書かれた`cl65`と`ld65`というコマンドが見つからないことが原因でした。これを解決するために、いくつかの方法を試しました。

### Visual Studio Codeの拡張機能の利用
　最初は、よくわからなかったのでとりあえず見つけたcc65用のVSCodeの拡張機能を入れました。結果として、これは意味がありませんでした。これはWindowsを想定して作られた拡張機能のため、いろいろなディレクトリが有効なものではありませんでした。また、PowerShellが開けないため動きませんでした。
 
https://marketplace.visualstudio.com/items?itemName=SharpNinja.cc65

### HomebrewをインストールしてGNUコマンドを使えるようにする
　これは、結局はやっていないので意味があったかどうかはわかりません。Linux向けのインストール手順を踏んだからできないのかと思い、GNUコマンドが使えるようにしようと思いました。しかし、それをする前に他のやり方を見つけたことと、Homebrewをインストールするのに難航してしまったのが原因です。私は家族共用のPCでやろうとしたため、Homebrewをホームディレクトリにインストールしようとしたため、まあまあな時間がかかりました。結局以下のサイトを参考にしてできましたが、結活用はしませんでした。

 https://tech.gootablog.com/article/homebrew-userhomedir/

　参考までに、私は試していませんが、Homebrew側からでもcc65をインストールできそうな感じだったので、公式サイトにあるようにGitを使わずに、こっちを使ってもいいかもしれません。ただ、その際にもcc65がインストールされているディレクトリに移動し、`make`コマンドを使って必要なファイルを揃える必要があるかもしれません。

https://formulae.brew.sh/formula/cc65#default

### PATHを通してコンパイラのコマンドを有効化する
　これをやったら成功しました。ターミナルで`which cc65`と実行しcc65がちゃんとあるのか、どこにあるのかを調べたところ、まず全くターミナル側に認識されていなかったようでした。調べてみたところ、環境変数であるPATHを通さないときちんと認識してくれないようでした。
 https://qiita.com/HORIZONium/items/b608f46c900ce527dbc9

 上の記事を参考にし、パスを通したところ、きちんと認識してくれるようになりました。まず、Gitからクローンしたcc65のフォルダの構成はこのようになっているかと思います。
 ```
 cc65
├─ ...
|
├─ bin
│  ├─ ar65
│  ├─ ...
│  └─ sp65
|
└─ ...
 ```
 ここで、`bin`に入っている`ar65`などのファイルがUNIX実行ファイルであり、これらをUNIXコマンドとして認識してもらいターミナルで実行できるようにする必要があります。上の記事や他の記事を参考に、
 ```
export PATH= ... /cc65/bin:$PATH
 ```
 (...は省略)
 のように書くことで、ターミナルに認識させ、コンパイルが実行できるようになりました。しかし、コンパイルできるようになったはいいものの、ターミナルを再起動すると、さっき通したパスがまた無効になってしまいました。そこで、調べてみると、bash_profileというところに書き込まないといけないことがわかりました。

https://qiita.com/soarflat/items/d5015bec37f8a8254380

しかし、書き込んでも反映されません。調べてみると、別の記事を見つけました。

https://programmer-life.work/programming-terms/bash-profile

どうやら、シェルの種類にはbashとzshと(他にもあるかも)があるみたいで、私の場合zshであったためbash_profileではなくzprofileに書き込まないといけないようでした。ターミナルでのいじり方がよくわからなかったので、VSCodeでzprofileのファイルを直接編集し、上のexportコマンドを書き込みましたが、問題なく読み込んでくれました。ちなみに、bash_profileおよびzprofileは最初はないようで、
```
touch .bash_profile
または
touch .zprofile
```
とすることで作成できるみたいです。

https://qiita.com/magatama/items/42173486201a75519e82

今回は付け焼き刃で動かしてしまい、ここら辺のシェルの話は結構込み入っているようなので、また改めて勉強できればと思います。
　パスを繋げたことによって、コンパイラは正しく動作するようになりました。途中から、動作確認は公式サイトにあるのを参考に、cc65のサンプルフォルダ内にあったtutorialのコンパイルを試すことで行っていました。

https://cc65.github.io/doc/intro.html 

しかし、tutorialのコンパイルができることを確認したのはいいものの、NES研究所さんのサンプルをmakefileでコンパイルしようとしたところ、問題が発生しました。`attribute expected`と出て、コンパイルができませんでした。しかしこれは既知の問題であったようで、配布されていたmakefileに問題があったものを改良したプロジェクトフォルダが配布されていたのでそちらのmakefileを実行したところうまくいきました。

https://symfoware.blog.fc2.com/blog-entry-1197.html

## 結論
　結局、Macでcc65を使えるようにするには
 - [Command Line Toolsをインストールする](#command-line-toolsのインストール)
 - [公式サイトを参考に、Gitでcc65をクローンしてくる](https://cc65.github.io/getting-started.html)
 - [クローンしてきたフォルダのbin内にあるUNIX実行ファイルにPATHを繋げる](#pathを通してコンパイラのコマンドを有効化する)

という手順でできると思います。Homebrewは正直必要かどうかは分かりません。また、Homebrewを用いてインストールした場合はGitクローンとパスを繋げる作業は省略できることになります。
　これで一応コンパイラが使えるようにはなりましたが、実際のソフト制作で動かして見たわけではないのでここからどんな不測の事態か起こるか分かりません。また何かわかったことがあれば追記していきます。参考にした記事の投稿者の方々、ありがとうございました！また、この記事が誰かの開発の一助となれば幸いです。