Open4

インストーラが無いソースコードのバイナリ配布

yonishiyonishi

ビルド済みバイナリを“インストーラ”として配布したい場合、主に2つのアプローチがあります。


1. make install + ステージングディレクトリ + tarball

  1. ステージング用ディレクトリを作る
    例えば /tmp/pkgconf-staging にインストール先を擬似的に作成します。

    make install DESTDIR=/tmp/pkgconf-staging
    

    すると、実際には

    /tmp/pkgconf-staging/usr/local/bin/pkgconf
    /tmp/pkgconf-staging/usr/local/bin/pkg-config
    /tmp/pkgconf-staging/usr/local/lib/libpkgconf.so.*
    …etc.
    

    のようにファイル群がまとめて配置されます。

  2. tarball を作る
    ステージングディレクトリ直下で tarball 化します。

    cd /tmp/pkgconf-staging
    tar czf ~/pkgconf-0.29.2-installer.tar.gz .
    

    これで、展開先のシステムで

    sudo tar xzf pkgconf-0.29.2-installer.tar.gz -C /
    

    とするだけで /usr/local/... 以下へ展開・インストールされる“簡易インストーラ”が完成します。

  3. オプション:シェルスクリプトでラップ
    上記 tarball 展開を自動化する小さなシェルスクリプトを同梱すると、ユーザーは

    sudo ./install-pkgconf.sh
    

    というひとコマンドで導入できてさらに親切です。


2. Debian パッケージ(.deb)化する

Debian 系ディストリビューション向けには、checkinstall ツールを使って、ビルド後すぐに .deb パッケージを生成できます。

# 依存 (build-essential など) は事前に揃えておく
sudo apt install checkinstall 

# 通常の make の代わりに…
sudo checkinstall --pkgname=pkgconf \
                  --pkgversion="0.29.2" \
                  --pkgrelease="1" \
                  --default
  • このコマンドが対話的に聞いてくる情報を確認後、pkgconf_0.29.2-1_amd64.deb のようなファイルが生成されます。

  • オフライン環境や他マシンに持っていって、

    sudo dpkg -i pkgconf_0.29.2-1_amd64.deb
    

    で正式インストールできるので、メンテナンス性も抜群です。

まとめ

  • 最も手軽make install DESTDIR=… → ステージング → tarball → 展開
  • パッケージ管理に乗せたいcheckinstall で即 .deb 化 → dpkg -i

用途や配布先の環境に合わせてお選びください。

yonishiyonishi

スクリプト

build_and_packages.sh
#!/usr/bin/env bash
set -euo pipefail

#── 設定 ────────────────────────────────────────────────────────────────────

# それぞれのライブラリ名とバージョン、ダウンロード URL を定義
declare -A libs=(
  [libsigc++]=3.2.0
  [glibmm]=2.70.0
  [cairomm]=1.16.1
  [pangomm]=2.50.0
  [gtkmm]=4.6.0
)

declare -A urls=(
  [libsigc++]=https://github.com/libsigcplusplus/libsigcplusplus/releases/download/3.2.0/libsigc++-3.2.0.tar.xz
  [glibmm]=https://gitlab.gnome.org/GNOME/glibmm/-/archive/2.70.0/glibmm-2.70.0.tar.gz
  [cairomm]=https://www.cairographics.org/releases/cairomm-1.16.1.tar.xz
  [pangomm]=https://gitlab.gnome.org/GNOME/pangomm/-/archive/2.50.0/pangomm-2.50.0.tar.gz
  [gtkmm]=https://download.gnome.org/sources/gtkmm/4.6/gtkmm-4.6.0.tar.xz
)

# インストール先プリフィックス(Tarball 展開後の配置先)
PREFIX="/usr/local"

# ビルド/ステージング用一時ディレクトリ
WORKDIR="$(pwd)/build_work"
STAGEDIR_BASE="/tmp"

# 出力先ディレクトリ
OUTDIR="$(pwd)/installers"
mkdir -p "$WORKDIR" "$OUTDIR"

#── 関数定義 ────────────────────────────────────────────────────────────────

build_and_package() {
  local name=$1
  local ver=$2
  local url=${urls[$name]}
  local archive="${name}-${ver}.tar.${url##*.}"
  local srcdir="${WORKDIR}/${name}-${ver}"
  local stagedir="${STAGEDIR_BASE}/${name}-${ver}-staging"
  local installer="${OUTDIR}/${name}-${ver}-installer.tar.gz"

  echo "=== Processing ${name}-${ver} ==="

  # 1) ダウンロード
  cd "$WORKDIR"
  if [ ! -f "$archive" ]; then
    echo "Downloading $archive..."
    wget -c "$url" -O "$archive"
  fi

  # 2) 解凍
  rm -rf "$srcdir"
  case "$archive" in
    *.tar.gz)  tar xzf "$archive" ;;
    *.tar.xz)  tar xJf "$archive" ;;
    *.zip)     unzip -q "$archive" ;;
    *)         echo "Unknown archive format: $archive"; exit 1 ;;
  esac

  # 3) ビルド&ステージングインストール
  rm -rf "$stagedir"
  mkdir -p "$stagedir"
  cd "$srcdir"

  if [ -f autogen.sh ]; then
    # autotools プロジェクト
    ./autogen.sh --prefix="$PREFIX" --enable-static
    make -j$(nproc)
    make DESTDIR="$stagedir" install
  else
    # CMake プロジェクト(libsigc++ の場合)
    cmake . -DCMAKE_INSTALL_PREFIX="$PREFIX" -DBUILD_SHARED_LIBS=OFF
    make -j$(nproc)
    make DESTDIR="$stagedir" install
  fi

  # 4) tarball 化
  echo "Creating installer ${installer} ..."
  cd "$stagedir"
  tar czf "$installer" .

  echo "-> ${installer} generated."
}

#── メイン ──────────────────────────────────────────────────────────────────

for lib in "${!libs[@]}"; do
  build_and_package "$lib" "${libs[$lib]}"
done

echo "All done. Installers are in: $OUTDIR"
yonishiyonishi

ImGUI

build-imgui-offline.sh
#!/usr/bin/env bash
set -euxo pipefail

BASE_DIR="$(pwd)"

#── バージョン設定 ──────────────────────────────────
IMGUI_REPO="https://github.com/ocornut/imgui.git"
IMGUI_TAG="v1.91.8"

GLFW_REPO="https://github.com/glfw/glfw.git"
GLFW_TAG="3.3.8"

WAYLAND_REPO="https://gitlab.freedesktop.org/wayland/wayland.git"
WAYLAND_TAG="1.21.0"

WAYLAND_PROTOCOLS_REPO="https://gitlab.freedesktop.org/wayland/wayland-protocols.git"
WAYLAND_PROTOCOLS_TAG="1.29"

LIBXKBCOMMON_REPO="https://github.com/xkbcommon/libxkbcommon.git"
LIBXKBCOMMON_TAG="xkbcommon-1.9.2"

LIBEPOXY_REPO="https://github.com/anholt/libepoxy.git"
LIBEPOXY_TAG="1.5.9"

# Vulkan SDK は LunarG SDK のオフラインアーカイブを事前にダウンロードしておく
# (例: vulkansdk-linux-x86_64-1.4.309.0.tar.xz)
VULKAN_SDK_ARCHIVE="vulkansdk-linux-x86_64-1.4.309.0.tar.xz"

#── 出力設定 ────────────────────────────────────────
STAGING="${BASE_DIR}/imgui_offline_staging"
OUT_TARBALL="${BASE_DIR}/imgui-wayland-opengl-vulkan-offline-installer.tar.xz"

rm -rf "${STAGING}" "${OUT_TARBALL}"
mkdir -p "${STAGING}"

#── ソース取得 ───────────────────────────────────────
cd "${STAGING}"
git clone --depth 1 --branch "${IMGUI_TAG}" "${IMGUI_REPO}" imgui
git clone --depth 1 --branch "${GLFW_TAG}" "${GLFW_REPO}" glfw
git clone --depth 1 --branch "${WAYLAND_TAG}" "${WAYLAND_REPO}" wayland
git clone --depth 1 --branch "${WAYLAND_PROTOCOLS_TAG}" "${WAYLAND_PROTOCOLS_REPO}" wayland-protocols
git clone --depth 1 --branch "${LIBXKBCOMMON_TAG}" "${LIBXKBCOMMON_REPO}" libxkbcommon
git clone --depth 1 --branch "${LIBEPOXY_TAG}" "${LIBEPOXY_REPO}" libepoxy

# ※Vulkan SDK アーカイブを staging にコピーしておく
cp "${BASE_DIR}/${VULKAN_SDK_ARCHIVE}" "${STAGING}/"

#── ビルド&インストール ────────────────────────────
# 各ライブラリは DESTDIR=${STAGING}/install 下に /usr 以下構成でインストールする

export PREFIX="/usr"
export DESTDIR="${STAGING}/install"

build_and_install() {
  local srcdir=$1
  local builddir="${srcdir}-build"
  mkdir -p "${builddir}"
  cd "${builddir}"
  meson setup . "../${srcdir}" --prefix="${PREFIX}"
  ninja install
  cd ..
}

# 1. libxkbcommon
build_and_install libxkbcommon

# 2. Wayland core
build_and_install wayland

# 3. wayland-protocols
build_and_install wayland-protocols

# 4. libepoxy (OpenGL ローダ)
build_and_install libepoxy

# 5. GLFW (Wayland+OpenGL/Vulkan 両対応)
cd "${STAGING}"
mkdir -p glfw-build && cd glfw-build
cmake ../glfw \
  -DCMAKE_INSTALL_PREFIX=${PREFIX} \
  -DGLFW_BUILD_DOCS=OFF -DGLFW_BUILD_TESTS=OFF \
  -DGLFW_BUILD_EXAMPLES=OFF \
  -DGLFW_CLIENT_LIBRARY=wayland \
  -DGLFW_BUILD_X11=OFF -DGLFW_BUILD_WAYLAND=ON \
  -DGLFW_VULKAN_STATIC=ON
cmake --build . && cmake --install .

# 6. ImGui 本体はヘッダ+バックエンド実装をそのままコピー
cd "${STAGING}"
mkdir -p install/${PREFIX}/src/imgui
cp -r imgui       install/${PREFIX}/src/imgui/
cp -r imgui/backends install/${PREFIX}/src/imgui/

# 7. Vulkan SDK 展開
cd "${STAGING}/install/${PREFIX}"
tar xJf "../../${VULKAN_SDK_ARCHIVE}"

#── オフラインインストーラー tarball 作成 ───────────
echo "▶︎ パッケージングを開始します..."
tar cJf "${OUT_TARBALL}" -C "${STAGING}/install" .
echo "▶︎ 完成:${OUT_TARBALL}"

yonishiyonishi

pkg-config

build-pkgconfig-offline.shj
#!/usr/bin/env bash
set -euxo pipefail

#── バージョン設定 ──────────────────────────────────
PKGVER="0.29.2"
PKGTARBALL="pkg-config-${PKGVER}.tar.gz"
# Freedesktop.org のリリース URL を利用(pkgconf.org は404のため)
PKGURL="https://pkgconfig.freedesktop.org/releases/${PKGTARBALL}"  # :contentReference[oaicite:0]{index=0}

#── 出力設定 ────────────────────────────────────────
STAGING_DIR="$(pwd)/pkgconfig-staging"
OUT_TARBALL="pkg-config-${PKGVER}-offline-installer.tar.xz"
JOBS="$(nproc)"

#── (1) クリーンアップ ─────────────────────────────────
rm -rf "${PKGTARBALL}" \
       "pkg-config-${PKGVER}" \
       "${STAGING_DIR}" \
       "${OUT_TARBALL}"

#── (2) ソース取得 ───────────────────────────────────
wget --no-check-certificate -c "${PKGURL}"

#── (3) 展開 ─────────────────────────────────────────
tar xzf "${PKGTARBALL}"

#── (4) ビルド ───────────────────────────────────────
cd "pkg-config-${PKGVER}"
./configure --prefix=/usr \
            --with-pc-path=/usr/lib/pkgconfig:/usr/share/pkgconfig
make -j"${JOBS}"

#── (5) ステージングディレクトリへインストール ───────────────
make DESTDIR="${STAGING_DIR}" install
cd ..

#── (6) 全ユーザー共通の環境設定スクリプトを追加 ─────────────
mkdir -p "${STAGING_DIR}/etc/profile.d"
cat > "${STAGING_DIR}/etc/profile.d/pkgconfig.sh" << 'EOF'
# オフライン環境でも /usr/lib/pkgconfig と /usr/share/pkgconfig を必ず参照
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig:$PKG_CONFIG_PATH
EOF

#── (7) オフラインインストーラー tarball 作成 ──────────────
tar cJf "${OUT_TARBALL}" -C "${STAGING_DIR}" .

echo "オフラインインストーラーを作成しました: ${OUT_TARBALL}"