Open4
インストーラが無いソースコードのバイナリ配布
ビルド済みバイナリを“インストーラ”として配布したい場合、主に2つのアプローチがあります。
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.
のようにファイル群がまとめて配置されます。
-
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/...
以下へ展開・インストールされる“簡易インストーラ”が完成します。 -
オプション:シェルスクリプトでラップ
上記 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
用途や配布先の環境に合わせてお選びください。
スクリプト
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"
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}"
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}"