[Brew] tapを用いてC言語で作った自作アプリをリリースしてみる
はじめに
自作でCLIを用いたアプリを作成して、それをリリースしてみたいと思ったことはありませんか?
MacやUbuntuなどでCLIアプリをインストールするには、Homebrewを用いてインストールをする方が多いため、そこに公開をする手順をまとめようと思う
最終形態
> brew tap harutiro/myqrencode
> brew install myqrencode
> myqrencode
これで実際に動くようにセットアップをしてみる
手順
公開したいCのファイルを用意する
今回は簡単にhelloworldと表示する何も面白くないファイルをリリースしてみましょう。
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
Hello, World!
本当に何も変哲もなくて面白くないですが、わかりやすい例なのでこのアプリをリリースしてみましょう。
Makefileを作る
では皆さんは、コンパイルをする時に通常は
> gcc main.c
と行うと思いますが、[make]と打つだけでコンパイルをしてくれるようにしてFormulaの記載を簡単にするためにmakefaileを作成していきましょう。
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にふたつのリポジトリを作成する必要があります。
- 実際のプログラミングソースファイルを管理するリポジトリ
- homebrewのリリース関係を管理するリポジトリ(Formulaファイルを用意する)
ではその中でも、実際のプログラミングソースファイルを管理するリポジトリの設定を行なっていきましょう。
タグをつけて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
に作成されますので、作成されたファイルを新しく作成したフォルダーに移動しておきましょう。
それでは、中身を書き換えていきましょう
デフォルトではこのようなファイルが作成されていると思います。
# 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ファイルの実行がされてコンパイルがされます。
そうしてできたファイルをインストールしてどこでも使えるような形にします。
# 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
実際のリポジトリ
参考文献
brewについて
makeファイルについて
Discussion