先日,7-zipが歴史的なバージョンアップを遂げたとのニュースがありました。
そこで,macOS環境にも 7-zip のコマンドライン版である 7zz コマンドをインストールしたいと考えます。
7zz コマンドのインストール方法
パッケージマネージャを使う場合
Homebrew の場合
$ brew install sevenzip
MacPorts の場合
$ sudo port install 7zip
公式バイナリを用いる場合
公式サイトのダウンロードページから 7-Zip for MacOS: console version をダウンロードする。
7zz バイナリの動作環境
ただし,これでインストールされる 7zz バイナリの動作環境を巡っては注意が必要です。
パッケージマネージャを使った場合
- そのホストマシンのCPUと同じCPUアーキテクチャ用 (
x86_64orarm64) - 動作するOSバージョンはそのホストマシンの macOS バージョン以降
公式バイナリを使った場合
-
x86_64+arm64の両方を含む Universal Binary - 動作OSは macOS 12 Monterey 以降
となります。
これでほぼ困ることはないのですが,自分でソースコードからビルドすることで,より広い環境で動くバイナリが生成できます。次のスクリプトでビルドすると,macOS 10.15 Catalina 以降で動く 7zz コマンドのUniversal Binary が生成できます。
ビルドスクリプト
#!/usr/bin/env bash
set -eux
# 1. 変数
VERSION="25.00"
URL="https://7-zip.org/a/7z${VERSION//./}-src.tar.xz"
ORIGDIR="$(pwd)"
WORKDIR="${ORIGDIR}/sevenzip_build"
export MACOSX_DEPLOYMENT_TARGET="10.15"
# 2. ダウンロードと展開
mkdir -p "${WORKDIR}"
cd "${WORKDIR}"
curl -fL -o "7z${VERSION//./}-src.tar.xz" "${URL}"
tar xf "7z${VERSION//./}-src.tar.xz"
# 3. clang, clang++ のラッパースクリプトを生成
cd "CPP/7zip/Bundles/Alone2"
WRAPPER_DIR="${WORKDIR}/wrapper-bin"
mkdir -p "${WRAPPER_DIR}"
## clangのswitch文に関する警告を抑制
cat > "${WRAPPER_DIR}/clang" << 'EOF'
#!/usr/bin/env bash
exec /usr/bin/clang "$@" -Wno-switch-default -Wno-switch -Wno-fatal-errors
EOF
chmod +x "${WRAPPER_DIR}/clang"
## clang++のswitch文に関する警告を抑制
cat > "${WRAPPER_DIR}/clang++" << 'EOF'
#!/usr/bin/env bash
exec /usr/bin/clang++ "$@" -Wno-switch-default -Wno-switch -Wno-fatal-errors
EOF
chmod +x "${WRAPPER_DIR}/clang++"
## ラッパースクリプトが代わりに呼び出されるように
export PATH="${WRAPPER_DIR}:$PATH"
export CC="clang"
export CXX="clang++"
export CFLAGS="-arch x86_64 -arch arm64 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}"
# 4. x86_64 バイナリのビルド
make -j$(sysctl -n hw.ncpu) -f ../../cmpl_mac_x64.mak DISABLE_RAR_COMPRESS=1
cp "b/m_x64/7zz" "${WORKDIR}/7zz_x86_64"
make -f ../../cmpl_mac_x64.mak clean
# 5. arm64 バイナリのビルド
make -j$(sysctl -n hw.ncpu) -f ../../cmpl_mac_arm64.mak DISABLE_RAR_COMPRESS=1
cp "b/m_arm64/7zz" "${WORKDIR}/7zz_arm64"
# 6. Universal Binary へ結合
lipo -create \
-output "${ORIGDIR}/7zz" \
"${WORKDIR}/7zz_x86_64" \
"${WORKDIR}/7zz_arm64"
# 7. 結果表示
echo "Universal 7zz created at ${ORIGDIR}/7zz:"
lipo -info "${ORIGDIR}/7zz"