macOSにfdcloneをインストールしていたのですが、最近のhomebrewでは

brew search fdclone
==> Formulae
fdclone ✔ (deprecated)

となってしまいまして、廃止だということになってしまいました。まだinstallできるけど随分と古い環境でmakeされたファイルがインストールされてしまいます。今後も使いたいので、自前でなんとかしてみました。


公式にパッチ送ったりすると、のちのち面倒な対応が発生したりすることになりかねないので、方針としてはとりあえず、ローカルのtapとして設定をするようにして、自前でmakeします。

前提として最新のhomebrewの環境がインストールされていること。当然ですが、コンパイラ環境もインストールしておきます。

#!/usr/bin/env bash
set -euo pipefail

# 1. ローカルTapリポジトリを作成 (既に存在する場合はスキップ)
if ! brew tap | grep -qx "local/fdclone"; then
  echo "==> Creating local tap: local/fdclone"
  brew tap-new local/fdclone
else
  echo "==> local/fdclone tap already exists."
fi

# 2. Tap ディレクトリおよび Formula ディレクトリのパスを取得・作成
TAP_DIR="$(brew --repository local/fdclone)"
mkdir -p "${TAP_DIR}/Formula"

# 3. Formula ファイル (fdclone.rb) を生成
echo "==> Generating Formula: ${TAP_DIR}/Formula/fdclone.rb"
cat << 'EOF' > "${TAP_DIR}/Formula/fdclone.rb"
class Fdclone < Formula
  desc "File Manager for UNIX-like OS"
  homepage "http://www.unixusers.net/authors/VA012337/soft/fd/"
  url "http://www.unixusers.net/authors/VA012337/soft/fd/FD-3.01j.tar.gz"
  mirror "https://deb.debian.org/debian/pool/main/f/fdclone/fdclone_3.01j.orig.tar.gz"
  version "3.01j"
  sha256 "fe5bb67eb670dcdb1f7368698641c928523e2269b9bee3d13b3b77565d22a121"
  license :cannot_represent

  # Rust製のコマンドライン検索ツール `fd` とコマンド名が重複するため競合を明記
  conflicts_with "fd", because: "both install `fd` binaries"

  def install
    # macOS システムヘッダとのインクルードガード競合を回避するための書き換え
    inreplace "dirent.h", "__DIRENT_H_", "__FD_DIRENT_H_"
    inreplace "printf.h", "__PRINTF_H_", "__FD_PRINTF_H_"

    # Makefile の依存関係順序を担保するためシングルスレッドでビルド
    ENV.deparallelize

    # Homebrew の Cellar パス / man パスに合わせてビルド・インストール
    system "make", "PREFIX=#{prefix}", "CONFDIR=#{etc}", "all"
    system "make", "PREFIX=#{prefix}", "CONFDIR=#{etc}", "MANTOP=#{man}", "install"

    # サンプル設定ファイルを pkgshare に配置
    pkgshare.install "_fdrc" => "fd2rc.dist"
  end

  def caveats
    <<~EOS
      To install the initial config file:
        install -c -m 0644 #{opt_pkgshare}/fd2rc.dist ~/.fd2rc

      To set application messages to Japanese, edit your ~/.fd2rc:
        MESSAGELANG="ja"
    EOS
  end

  test do
    # fd のシェルモード (fdsh) を利用して正常動作を確認
    assert_match "Hello Homebrew", shell_output("#{bin}/fdsh -c \"echo Hello Homebrew\"")
  end
end
EOF

echo "==> Done! Formula created at ${TAP_DIR}/Formula/fdclone.rb"
echo ""
echo "To build and install fdclone, run:"
echo "  brew install --build-from-source local/fdclone/fdclone"

このbashのスクリプトを実行するとローカルのtapにFormulaファイルの設定が書き込まれて、これをbrewコマンドでinstallするとfdcloneがmakeされて、従前のようにfdcloneを使うことができるようになります。

設定ファイルは ~/.fd2rc ですので(自動でインストールされます)、こちらを書き換えると設定の変更などができます。

なんか最近のmacOSのコンパイラだとmake通らないなあ、と思っていたのですが、AIさんに聞いたところ、「macOS システムヘッダとのインクルードガード競合を回避するための書き換え」があればmake通るとわかりまして、その反映をしたFormulaファイルをAIに作成させています。