[Brew]　tapを用いてC言語で作った自作アプリをリリースしてみる

# はじめに
自作でCLIを用いたアプリを作成して、それをリリースしてみたいと思ったことはありませんか？
MacやUbuntuなどでCLIアプリをインストールするには、Homebrewを用いてインストールをする方が多いため、そこに公開をする手順をまとめようと思う

### 最終形態
```
> brew tap harutiro/myqrencode
> brew install myqrencode
> myqrencode
```
これで実際に動くようにセットアップをしてみる

# 手順

## 公開したいCのファイルを用意する

今回は簡単にhelloworldと表示する何も面白くないファイルをリリースしてみましょう。

```c:helloBrew.c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
```

```:helloBrew.c　の　出力結果
Hello, World!
```

本当に何も変哲もなくて面白くないですが、わかりやすい例なのでこのアプリをリリースしてみましょう。

## Makefileを作る
![](https://storage.googleapis.com/zenn-user-upload/e2f999df756e-20220723.png)

では皆さんは、コンパイルをする時に通常は
```:コンソール
> gcc main.c
```
と行うと思いますが、[make]と打つだけでコンパイルをしてくれるようにしてFormulaの記載を簡単にするためにmakefaileを作成していきましょう。

```makefile:Makefile
CC=gcc
CFLAGS=-O

helloBrew: helloBrew.c
	$(CC) $(CFLAGS) -o helloBrew helloBrew.c -lncurses
```

実際にこれを打ってもらったら、makeと打つだけで本当にコンパイルされるか確認してみましょう

```:コンソール
❯ make
gcc -O -o helloBrew helloBrew.c -lncurses
```
そうすると、helloBrewファイルが作成されたと思います。
では、実際に実行をして出力されるか確認してみましょう

``` :コンソール
❯ ./helloBrew
Hello, World!
```
これで[make]だけでコンパイルができるようになりました。

## GitHubの必要なリポジトリを理解する
それではここからはリリース作業に入っていきたいと思います。
リリースをするのにGithubにふたつのリポジトリを作成する必要があります。

- 実際のプログラミングソースファイルを管理するリポジトリ

https://github.com/harutiro/BrewTapHello

- homebrewのリリース関係を管理するリポジトリ(Formulaファイルを用意する)

https://github.com/harutiro/homebrew-BrewTapHello

:::note
コチラのレポジトリは名前の指定があります。
homebrew-<レポジトリ名>のように、最初に```homebrew-```を書く必要があるため気をつけましょう
:::


ではその中でも、実際のプログラミングソースファイルを管理するリポジトリの設定を行なっていきましょう。


## タグをつけてGitHubにPushする
とりあえず、hello.cとMakefileをリモート側の”実際のプログラミングソースファイルを管理するリポジトリ”にPushしておきましょう

その後に、実際にタグをつけてリリースとしてファイルをまとめてみましょう。

```:コンソール
> git tag 0.0.1
> git push origin 0.0.1
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/harutiro/BrewTapHello.git
 * [new tag]         0.0.1 -> 0.0.1
```

Githubの中のリリースの場所を押しましょう
![](https://storage.googleapis.com/zenn-user-upload/b05cf713f0b9-20220723.png)

リリースしたいタグのバージョンと、リリースの名前を記載して、リリースと押しましょう
![](https://storage.googleapis.com/zenn-user-upload/b670bd94bad4-20220723.png)

リリースをしたら、tar.gzの方のリンク先のアドレスをコピーしておきましょう
![](https://storage.googleapis.com/zenn-user-upload/0d7e9a4ee991-20220723.png)



## Formulaファイルを作る


それでは、Formulaファイルを作成して、”homebrewのリリース関係を管理するリポジトリ”を作成していきましょう。


新しいフォルダーを作成して移動します。
```:コンソール
>brew create　https://github.com/harutiro/BrewTapHello/archive/refs/tags/0.0.1.tar.gz
```
そうすることによってFormulaファイルが自動で開かれると思います。

Formulaファイルは
/opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/brewtaphello.rb
に作成されますので、作成されたファイルを新しく作成したフォルダーに移動しておきましょう。

それでは、中身を書き換えていきましょう
デフォルトではこのようなファイルが作成されていると思います。
```rb:brewtaphello.rb
# Documentation: https://docs.brew.sh/Formula-Cookbook
#                https://rubydoc.brew.sh/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
class Brewtaphello < Formula
  desc ""
  homepage ""
  url "https://github.com/harutiro/BrewTapHello/archive/refs/tags/0.0.1.tar.gz"
  sha256 "657452206064c869c17f9c3d8caad492b6a42a745aac98d2e8b0d0d82bc7d684"
  license ""

  # depends_on "cmake" => :build

  def install
    # ENV.deparallelize  # if your formula fails when building in parallel
    # Remove unrecognized options if warned by configure
    # https://rubydoc.brew.sh/Formula.html#std_configure_args-instance_method
    system "./configure", *std_configure_args, "--disable-silent-rules"
    # system "cmake", "-S", ".", "-B", "build", *std_cmake_args
  end

  test do
    # `test do` will create, run in and delete a temporary directory.
    #
    # This test will fail and we won't accept that! For Homebrew/homebrew-core
    # this will need to be a test that verifies the functionality of the
    # software. Run the test with `brew test BrewTapHello`. Options passed
    # to `brew install` such as `--HEAD` also need to be provided to `brew test`.
    #
    # The installed folder is not in the path, so use the entire path to any
    # executables being tested: `system "#{bin}/program", "do", "something"`.
    system "false"
  end
end

```

それを、下記のように変更してください
def installのところで、インストールをされた時の動作が行われます。
今回でしたら、system "make"でmakeファイルの実行がされてコンパイルがされます。
そうしてできたファイルをインストールしてどこでも使えるような形にします。
```rb:brewtaphello.rb
# Documentation: https://docs.brew.sh/Formula-Cookbook
#                https://rubydoc.brew.sh/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
class Brewtaphello < Formula
  desc ""
  homepage ""
  url "https://github.com/harutiro/BrewTapHello/archive/refs/tags/0.0.1.tar.gz"
  sha256 "657452206064c869c17f9c3d8caad492b6a42a745aac98d2e8b0d0d82bc7d684"
  license ""

  # depends_on "cmake" => :build

  def install
    system "make"
    bin.install "helloBrew"
  end
end

```

後はコミットしてリモート側にPushを行いましょう
これでリリースの設定は終わりました。

## インストールをしてみる（別PCで行う）

後はリリースされているファイルを実際にインストールをしてみましょう
なぜか、リリースをおこなったPCだとエラーを吐いてインストールができないため、別のPCを用いてインストールの確認を行なってみましょう

##### コマンドの説明
brew tap ユーザー名/レポジトリ名
brew install リポジトリ名
brew install ｃのファイル名

```:コンソール
> brew tap harutiro/BrewTapHello
> brew install BrewTapHello
> brewHello
```

# 実際のリポジトリ

https://github.com/harutiro/homebrew-BrewTapHello

https://github.com/harutiro/BrewTapHello


# 参考文献

### brewについて
https://qiita.com/NaotoFujihiro/items/a42cc8e3ce06d835e858

https://tech.fusic.co.jp/posts/homebrew-tap-publish/

https://github.com/masawada/chikubeam

### makeファイルについて
 
 http://omilab.naist.jp/~mukaigawa/misc/Makefile.html
 
 https://www.miraclelinux.com/tech-blog/0icygs