🌊

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

2022/07/23に公開

はじめに

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

最終形態

> brew tap harutiro/myqrencode
> brew install myqrencode
> myqrencode

これで実際に動くようにセットアップをしてみる

手順

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

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

helloBrew.c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
helloBrew.c の 出力結果
Hello, World!

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

Makefileを作る

では皆さんは、コンパイルをする時に通常は

コンソール
> gcc main.c

と行うと思いますが、[make]と打つだけでコンパイルをしてくれるようにしてFormulaの記載を簡単にするためにmakefaileを作成していきましょう。

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

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

タグをつけて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の中のリリースの場所を押しましょう

リリースしたいタグのバージョンと、リリースの名前を記載して、リリースと押しましょう

リリースをしたら、tar.gzの方のリンク先のアドレスをコピーしておきましょう

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
に作成されますので、作成されたファイルを新しく作成したフォルダーに移動しておきましょう。

それでは、中身を書き換えていきましょう
デフォルトではこのようなファイルが作成されていると思います。

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ファイルの実行がされてコンパイルがされます。
そうしてできたファイルをインストールしてどこでも使えるような形にします。

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 cのファイル名

コンソール
> 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

Discussion