Homebrew: write your own brew formula

GraalVM is a recent development in the Java ecosystem that allows you to generate native binaries for applications that run on the Java Virtual Machine (JVM). One of the main advantages of this is that it gets around the JVMs slow startup time which is a problem for short lived programs that are run often. This has lead to a projects like zprint releasing native binaries. This is great but, it doesn't give you a nice reproducible way to install/manage/uninstall these executables. For that we want a package manager like homebrew.

To install a package via homebrew you need to have a brew formula. A formula is a package definition written in Ruby. There isn't currently a brew formula for zprint so we will need to write our own.

The formula

Write the following formula in a file called clj-zprint.rb:

class CljZprint < Formula
  desc "Formatter for Clojure"
  homepage "https://github.com/kkinnear/zprint"
  version "2020.08.09"

  if OS.linux?
    url "https://github.com/kkinnear/zprint/releases/download/1.0.0/zprintl-1.0.0"
    sha256 "b707f1188c175c2028c014f0ae88cb384283aa6d097bb31298d66852162581b1"
  else
    url "https://github.com/kkinnear/zprint/releases/download/1.0.0/zprintm-1.0.0"
    sha256 "b707f1188c175c2028c014f0ae88cb384283aa6d097bb31298d66852162581b1"
  end

  def install
    system "mv zprintm-1.0.0 clj-zprint"
    system "chmod 755 clj-zprint"
    bin.install "clj-zprint"
  end

  test do
    system "#{bin}/clj-zprint"
  end
end

We create a class called CljZprint that extends the Formula class. We add some meta data: description, homepage and version. We specify which binary to download based on the OS the formula is running on and how it should be installed. Finally we test that the executable has been installed correctly by running it.

Install the package

To install the package we run the formula with the following command (in the directory that contains the formula):

brew install --build-from-source clj-zprint.rb

You can now call clj-zprint from the shell/terminal.

Uninstall the package

To uninstall the package we can run:

brew uninstall clj-zprint

The full example project can be found here.