自作ライブラリを brew install してみた

# 概要
最近、MacOSを使い始めました。
`brew install` めっちゃ便利やん、とか思いつつ、ジョーク・コマンドである `sl`  や `cmatrix` で遊んでいました。

そんな時、「令和をアスキーアートでターミナルに表示したい」と思い、ライブラリを自作してみました。

もし、この記事を参考に自作ライブラリを作成してくださる方がいれば、ライブラリ名やファイル名を適宜変更してみてください。

基本的には、[Homebrew](https://docs.brew.sh/Formula-Cookbook) の公式ドキュメントを参照しています。


# 実行コマンド
下記コマンドを実行すると、「令和」とターミナルで表示できます。

```
$ brew tap NaotoFujihiro/reiwa
$ brew install reiwa
$ reiwa
```

# 実行結果

<img width="762" alt="reiwa_printed_on_terminal.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/55513ce3-b7f0-257d-4012-a46f24afa99d.png">

# リポジトリ構成

作成したライブラリは、下記リポジトリに格納しています。

1. [reiwa](https://github.com/NaotoFujihiro/reiwa/commits/master)

C++で記述しているので、下記のファイルが必要です。

- reiwa.cpp
- reiwa.1
- Makefile

2. [Homebrew-reiwa](https://github.com/NaotoFujihiro/homebrew-reiwa)

自作ライブラリを `brew install` するために必要です。

- reiwa.rb


# ライブラリの作成

`reiwa.cpp` や `Makefile` などの必要なファイルを作成します。

```C++:reiwa.cpp
// Copyright (c) 2019 Naoto Fujihiro <naoto.fujihiro@gmail.com>

#include <iostream>

int main() {
  std::cout << "     ■                  " << "\n";
  std::cout << "    ■■■        ■■■      " << "\n";
  std::cout << "   ■■ ■■     ■■■   ■■■■■" << "\n";
  std::cout << "   ■   ■■      ■   ■   ■" << "\n";
  std::cout << " ■■     ■■     ■   ■   ■" << "\n";
  std::cout << "■■ ■■■■■ ■■  ■■■■■■■   ■" << "\n";
  std::cout << "               ■■  ■   ■" << "\n";
  std::cout << " ■■■■■■■■■    ■■■  ■   ■" << "\n";
  std::cout << "    ■    ■    ■■ ■ ■   ■" << "\n";
  std::cout << "    ■    ■   ■ ■   ■   ■" << "\n";
  std::cout << "    ■    ■   ■ ■   ■   ■" << "\n";
  std::cout << "    ■    ■     ■   ■■■■■" << "\n";
  std::cout << "    ■  ■■■     ■   ■   ■" << "\n";
  std::cout << "    ■          ■        " << "\n";
}
```

```file:Makefile
CC=g++
CFLAGS=-O

reiwa: reiwa.cpp
    $(CC) $(CFLAGS) -o reiwa reiwa.cpp
```

ソースコード一式を、予め作成しておいた `reiwa` リポジトリにpushします。

最後に、tag付けします。

```
$ git tag 0.0.1
$ git push origin 0.0.1
```


# Formulaの作成

それでは、 `brew install` できるようにしていきます。

まずは、Formulaを作成します。

```
$ brew create https://github.com/NaotoFujihiro/reiwa/archive/0.0.1.tar.gz
```

<img width="762" alt="brew_create_formula.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/014d6d95-d2af-da5a-68da-7707509d8da3.png">


コマンドを実行すると、 `reiwa.rb` という名前で、Formulaが作成されます。

保存場所は、
`/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/`
です。

なお、`sha256` は `https://github.com/NaotoFujihiro/reiwa/releases` からダウンロードしてきた、tag付けされた `tar.gz`ファイルに対し、

```
$ openssl dgst -sha256 ~/Downloads/reiwa-0.0.1.tar.gz
SHA256(/Users/Tachikoma/Downloads/reiwa-0.0.1.tar.gz)= 
```

と実行すると、取得することができるので、それを記述します。

最後に、作成したFormulaを、予め作成しておいた `Homebrew-reiwa` リポジトリにpushします。

これで、`brew install reiwa` できるようになりました！


# 蛇足
ソースコードを修正して再度pushした場合など、既に `brew tap` したライブラリを削除したい時もあるかと思います。

そんな時は、

```
$ rm -rf /Users/<ユーザー名>/Library/Logs/Homebrew/reiwa
$ rm /Users/<ユーザー名>/Library/Caches/Homebrew/downloads/hogehoge--homebrew-reiwa-0.0.1.tar.gz\
$ rm -rf /usr/local/Homebrew/Library/Taps/naotofujihiro/
```

などのコマンドで、キャッシュやダウンロードファイルを削除してみてください。


## はまったところ

`homebrew-reiwa` リポジトリと、 `reiwa` リポジトリのどちらにどのファイルを置けば良いのかという部分で混乱し、なかなか `make` が通らなかった。


# 参考記事
https://qiita.com/hayashier/items/dd699857253b1f433655
https://qiita.com/masawada/items/484bbf83ef39cad7af74
https://github.com/masawada/homebrew-chikubeam
https://github.com/masawada/chikubeam
https://qiita.com/mountcedar/items/f10161d4e483aa8c1283
https://qiita.com/lrf141/items/9ba070a2a1c3e5faf71c
https://qiita.com/phi/items/b6a8073eca1a343204fb
cf. https://github.com/Homebrew/brew