CMakeのinstallコマンド完全ガイド:正しい依存関係管理と5つの実践的な使用例

CMakeのinstallコマンドとは:基礎から応用まで

installコマンドが解決する3つの課題

CMakeのinstallコマンドは、C++プロジェクトの配布とインストールを効率的に管理するための重要な機能です。以下の3つの主要な課題を解決します:

  1. システム依存パスの統一管理
  • 異なるOSでのインストールパスの違いを吸収
  • システム標準のディレクトリ構造への適切な配置
  • マルチプラットフォーム対応の簡素化
  1. 依存関係の適切な解決
  • 必要なライブラリファイルの配置
  • ヘッダーファイルの適切なインストール
  • バージョン管理との連携
  1. 配布パッケージの一貫性確保
  • 必要なファイルの漏れない配置
  • 適切なパーミッションの設定
  • 設定ファイルの環境依存の解消

installコマンドの基本的な構文と動作原理

CMakeのinstallコマンドは、以下の基本構文で使用します:

install(TARGETS <target>
        DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>])

動作の流れは以下のようになります:

  1. 構成フェーズ
  • インストール先ディレクトリの決定
  • インストール対象ファイルのリスト作成
  • パーミッションと設定の確認
  1. ビルドフェーズ
  • 必要なファイルのビルド
  • 依存関係の解決
  • インストール用スクリプトの生成
  1. インストールフェーズ
  • ファイルの適切な配置
  • パーミッションの設定
  • 必要に応じた設定ファイルの生成

以下は基本的な使用例です:

# 実行ファイルのインストール
install(TARGETS myapp
        DESTINATION bin)

# ライブラリのインストール
install(TARGETS mylib
        DESTINATION lib)

# ヘッダーファイルのインストール
install(FILES include/mylib.h
        DESTINATION include)

このコマンドは、CMAKE_INSTALL_PREFIX変数で指定されたベースディレクトリを基準に、各ファイルを適切なサブディレクトリに配置します。

重要な設定変数

installコマンドの動作に影響を与える主要な変数:

変数名説明デフォルト値
CMAKE_INSTALL_PREFIXインストールのベースディレクトリUnixでは/usr/local
CMAKE_INSTALL_BINDIR実行ファイルの配置先bin
CMAKE_INSTALL_LIBDIRライブラリの配置先lib
CMAKE_INSTALL_INCLUDEDIRヘッダーファイルの配置先include

これらの変数を適切に設定することで、プロジェクトの配布とインストールを効率的に管理できます。

installコマンドの正しい設定手順

install()関数の基本的な使い方

CMakeのinstall()関数は、プロジェクトの成果物を適切にシステムに配置するための強力なツールです。基本的な使用パターンは以下の通りです:

# プロジェクトの基本設定
cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0)

# ライブラリの作成
add_library(mylib SHARED
    src/lib1.cpp
    src/lib2.cpp
)

# 基本的なインストール設定
install(TARGETS mylib
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}  # 共有ライブラリ
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}  # 静的ライブラリ
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}  # DLL(Windowsの場合)
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib  # ヘッダーファイル
)

対象別のインストールディレクトリ設定

各種ファイルタイプに応じた適切なインストールディレクトリの設定方法:

# GNUのインストールディレクトリ変数の includeを推奨
include(GNUInstallDirs)

# 実行ファイルのインストール
install(TARGETS myapp
    RUNTIME
    DESTINATION ${CMAKE_INSTALL_BINDIR}
    COMPONENT runtime
)

# 設定ファイルのインストール
install(FILES config/myapp.conf
    DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/myapp
    COMPONENT config
)

# ドキュメントのインストール
install(FILES README.md LICENSE
    DESTINATION ${CMAKE_INSTALL_DOCDIR}
    COMPONENT docs
)

インストールコンポーネントの推奨構成:

コンポーネント用途典型的な配置先
runtime実行ファイルbin/
libraryライブラリファイルlib/
development開発用ファイルinclude/
config設定ファイルetc/
docsドキュメントshare/doc/

パーミッションとオプションの詳細設定

ファイルタイプごとの適切なパーミッションとオプションの設定:

# 実行ファイルのパーミッション設定
install(TARGETS myapp
    RUNTIME
    DESTINATION ${CMAKE_INSTALL_BINDIR}
    PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
                GROUP_READ GROUP_EXECUTE
                WORLD_READ WORLD_EXECUTE
)

# 設定ファイルのパーミッション設定(制限付き)
install(FILES config/myapp.conf
    DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/myapp
    PERMISSIONS OWNER_READ OWNER_WRITE
                GROUP_READ
                WORLD_READ
)

# スクリプトファイルの実行権限付きインストール
install(PROGRAMS scripts/cleanup.sh
    DESTINATION ${CMAKE_INSTALL_BINDIR}
)

重要な設定オプション:

  1. EXCLUDE_FROM_ALL
  • パッケージに含めないファイルの指定
  • 開発時のみ必要なファイルの除外に使用
  1. OPTIONAL
  • インストール失敗時にエラーを無視
  • 存在しない可能性のあるファイルに使用
  1. CONFIGURATIONS
  • 特定のビルド設定でのみインストール
  • Debug/Release別の設定が必要な場合に使用
# ビルド設定別のインストール
install(TARGETS myapp
    CONFIGURATIONS Debug
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/debug
)

install(TARGETS myapp
    CONFIGURATIONS Release
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

これらの設定を適切に組み合わせることで、プロジェクトの要件に応じた柔軟なインストール設定が可能になります。特に、セキュリティとメンテナンス性を考慮したパーミッション設定は、プロダクション環境での運用において重要な要素となります。

依存関係管理のベストプラクティス

外部ライブラリの効率的なインストール設定

外部ライブラリの依存関係を適切に管理することは、プロジェクトの移植性と保守性を高める重要な要素です。以下に、効率的な依存関係管理の方法を示します:

# 外部ライブラリの検索
find_package(Boost 1.70 REQUIRED COMPONENTS system filesystem)
find_package(OpenSSL REQUIRED)

# 依存関係を含むターゲットの定義
add_library(mylib SHARED
    src/mylib.cpp
)

# 依存関係の設定
target_link_libraries(mylib
    PUBLIC
        Boost::system
        Boost::filesystem
    PRIVATE
        OpenSSL::SSL
        OpenSSL::Crypto
)

# インストール設定
install(TARGETS mylib
    EXPORT mylibTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

# エクスポート設定のインストール
install(EXPORT mylibTargets
    FILE mylibTargets.cmake
    NAMESPACE mylib::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/mylib
)

バージョン管理との連携手法

バージョン管理を適切に行うことで、ライブラリの互換性を保証し、アップグレードパスを明確にできます:

# バージョン情報の設定
set(MYLIB_VERSION_MAJOR 1)
set(MYLIB_VERSION_MINOR 2)
set(MYLIB_VERSION_PATCH 3)
set(MYLIB_VERSION "${MYLIB_VERSION_MAJOR}.${MYLIB_VERSION_MINOR}.${MYLIB_VERSION_PATCH}")

# バージョン情報を含むヘッダーの生成
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/include/mylib/version.h.in
    ${CMAKE_CURRENT_BINARY_DIR}/include/mylib/version.h
)

# Config-fileバージョンの作成
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "mylibConfigVersion.cmake"
    VERSION ${MYLIB_VERSION}
    COMPATIBILITY SameMajorVersion
)

# Configファイルのインストール
install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/mylibConfigVersion.cmake"
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mylibConfig.cmake"
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/mylib
)

システム依存を考慮したインストールパス設定

異なるプラットフォームでの互換性を確保するための設定方法:

# プラットフォーム固有のパス設定
if(WIN32)
    set(DATA_INSTALL_DIR "data")
    set(PLUGIN_INSTALL_DIR "plugins")
    set(CONFIG_INSTALL_DIR "config")
else()
    set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
    set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/plugins")
    set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME}")
endif()

# 相対パスの使用
set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")

システム依存パスの推奨設定:

プラットフォーム実行ファイルライブラリ設定ファイル
Linux/usr/local/bin/usr/local/lib/etc
Windowsbin/lib/config/
macOS/Applications/usr/local/lib~/Library/Application Support

以下のような関数を使用して、依存関係の自動検出と設定を行うことができます:

function(configure_dependencies target)
    # 依存ライブラリの検索
    find_package(Dependencies REQUIRED)

    # RPATHの設定
    if(APPLE)
        set_target_properties(${target} PROPERTIES
            INSTALL_RPATH "@loader_path/../lib"
        )
    elseif(UNIX)
        set_target_properties(${target} PROPERTIES
            INSTALL_RPATH "$ORIGIN/../lib"
        )
    endif()

    # 依存関係の設定
    target_link_libraries(${target}
        PUBLIC
            Dependencies::Core
        PRIVATE
            Dependencies::Extra
    )
endfunction()

これらの設定を適切に組み合わせることで、プラットフォームに依存しない堅牢な依存関係管理が実現できます。また、バージョン管理との連携により、ライブラリの更新やメンテナンスが容易になります。

実践的なCMake installの使用例5選

共有ライブラリのインストール設定

共有ライブラリを作成し、適切にインストールする例を示します:

# ライブラリのバージョン設定
set(LIB_VERSION_MAJOR 1)
set(LIB_VERSION_MINOR 0)
set(LIB_VERSION_PATCH 0)
set(LIB_VERSION "${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${LIB_VERSION_PATCH}")

# 共有ライブラリの作成
add_library(mathlib SHARED
    src/addition.cpp
    src/subtraction.cpp
    src/multiplication.cpp
)

# バージョン情報の設定
set_target_properties(mathlib PROPERTIES
    VERSION ${LIB_VERSION}
    SOVERSION ${LIB_VERSION_MAJOR}
)

# インストール設定
install(TARGETS mathlib
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        COMPONENT libraries
        NAMELINK_COMPONENT development
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        COMPONENT development
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mathlib
        COMPONENT development
)

実行ファイルと設定ファイルの配置

アプリケーションの実行ファイルと関連設定ファイルのインストール例:

# 実行ファイルの作成
add_executable(myapp
    src/main.cpp
    src/config_handler.cpp
)

# 設定ファイルのパス定義
if(WIN32)
    set(CONFIG_PATH "config")
else()
    set(CONFIG_PATH "${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME}")
endif()

# 設定ファイルのパスをコード内で使用できるように定義
target_compile_definitions(myapp PRIVATE
    CONFIG_FILE_PATH="${CONFIG_PATH}/config.ini"
)

# インストール設定
install(TARGETS myapp
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        COMPONENT applications
)

# 設定ファイルのインストール
install(FILES config/config.ini
    DESTINATION ${CONFIG_PATH}
    COMPONENT configuration
    PERMISSIONS OWNER_READ OWNER_WRITE
                GROUP_READ
                WORLD_READ
)

ヘッダーファイルの適切なインストール

公開ヘッダーファイルと内部ヘッダーファイルの区別を考慮したインストール例:

# ヘッダーファイルの分類
set(PUBLIC_HEADERS
    include/mylib/public_api.h
    include/mylib/types.h
)

set(PRIVATE_HEADERS
    src/internal/impl_details.h
    src/internal/utilities.h
)

# ライブラリターゲットの設定
add_library(mylib
    ${PUBLIC_HEADERS}
    ${PRIVATE_HEADERS}
    src/implementation.cpp
)

# パブリックヘッダーの設定
set_target_properties(mylib PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
)

# インストール設定
install(TARGETS mylib
    PUBLIC_HEADER
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
        COMPONENT development
)

# 追加のヘッダーディレクトリ構造の維持
install(DIRECTORY include/mylib/
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
    COMPONENT development
    FILES_MATCHING PATTERN "*.h"
)

プラグインシステムの構築

動的にロード可能なプラグインのインストール設定例:

# プラグインのベースクラス
add_library(plugin_base SHARED
    src/plugin/base.cpp
)

# 各プラグインの作成
add_library(plugin1 MODULE
    src/plugins/plugin1.cpp
)

add_library(plugin2 MODULE
    src/plugins/plugin2.cpp
)

# プラグインの依存関係設定
target_link_libraries(plugin1 PRIVATE plugin_base)
target_link_libraries(plugin2 PRIVATE plugin_base)

# プラグインのインストールパス設定
if(WIN32)
    set(PLUGIN_INSTALL_DIR "plugins")
else()
    set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/plugins")
endif()

# インストール設定
install(TARGETS plugin_base
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(TARGETS plugin1 plugin2
    LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}
    RUNTIME DESTINATION ${PLUGIN_INSTALL_DIR}
)

マルチプラットフォーム対応のインストール設定

異なるプラットフォームに対応したインストール設定の例:

# プラットフォーム固有の設定
if(WIN32)
    # Windowsの場合
    set(DATA_DIR "data")
    set(RUNTIME_DEST "bin")

    # DLLの依存関係の収集
    include(InstallRequiredSystemLibraries)

elseif(APPLE)
    # macOSの場合
    set(DATA_DIR "Contents/Resources")
    set(RUNTIME_DEST "Contents/MacOS")

    # バンドル情報の設定
    set_target_properties(myapp PROPERTIES
        MACOSX_BUNDLE TRUE
        MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/Info.plist.in
    )

else()
    # Linux/Unixの場合
    set(DATA_DIR "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
    set(RUNTIME_DEST "${CMAKE_INSTALL_BINDIR}")
endif()

# 共通のインストール設定
install(TARGETS myapp
    BUNDLE DESTINATION .
    RUNTIME DESTINATION ${RUNTIME_DEST}
)

# データファイルのインストール
install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources/
    DESTINATION ${DATA_DIR}
    FILES_MATCHING 
        PATTERN "*.txt"
        PATTERN "*.json"
        PATTERN "*.xml"
)

# プラットフォーム固有のファイルのインストール
if(WIN32)
    install(FILES ${CMAKE_SOURCE_DIR}/platform/windows/myapp.ico
        DESTINATION ${DATA_DIR}/icons
    )
elseif(APPLE)
    install(FILES ${CMAKE_SOURCE_DIR}/platform/macos/myapp.icns
        DESTINATION ${DATA_DIR}/icons
    )
else()
    install(FILES ${CMAKE_SOURCE_DIR}/platform/linux/myapp.png
        DESTINATION ${DATA_DIR}/icons
    )
endif()

これらの例は、実際のプロジェクトで必要となる典型的なインストール設定を示しています。各例は、プラットフォームの違いや特殊要件を考慮しながら、メンテナンス性と再利用性の高い実装方法を提示しています。

トラブルシューティングとデバッグ手法

よくあるエラーとその解決方法

CMake installで遭遇する一般的なエラーとその解決方法を紹介します:

エラー原因解決方法
Permission deniedインストール先のパーミッション不足– sudo権限での実行
– インストール先ディレクトリのパーミッション確認
File not foundファイルパスの誤り– 相対パスから絶対パスへの変更
– ファイルの存在確認
Target not foundターゲット名の誤りや未定義– add_library/add_executableの確認
– ターゲット名のスペルチェック
RPATH issues動的ライブラリの検索パス問題– CMAKE_INSTALL_RPATHの設定
– chrpathやinstall_name_toolの使用
# RPATHの問題解決例
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)

if(APPLE)
    set(CMAKE_INSTALL_RPATH "@loader_path/../lib")
else()
    set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
endif()

インストール結果の検証方法

インストール結果を効果的に検証するためのチェックリスト:

  1. ファイル配置の確認
# インストール先ディレクトリの構造確認
tree ${CMAKE_INSTALL_PREFIX}

# 実行ファイルの依存関係確認
ldd ${CMAKE_INSTALL_PREFIX}/bin/myapp  # Linux
otool -L ${CMAKE_INSTALL_PREFIX}/bin/myapp  # macOS
  1. パーミッションの検証
# ファイルのパーミッション確認
ls -l ${CMAKE_INSTALL_PREFIX}/bin/myapp
ls -l ${CMAKE_INSTALL_PREFIX}/lib/libmylib.so
  1. シンボリックリンクの確認
# 共有ライブラリのシンボリックリンク確認
ls -la ${CMAKE_INSTALL_PREFIX}/lib/libmylib.so*

効率的なデバッグの進め方

  1. ログ出力の活用
# インストール処理のデバッグログ有効化
set(CMAKE_INSTALL_MESSAGE ALWAYS)

# 詳細なログ出力
install(FILES myfile.txt
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}
    MESSAGE_NEVER  # 特定のファイルのログを抑制
)
  1. インストール処理の段階的な検証
# コンポーネント単位でのインストール
cmake --install . --component runtime
cmake --install . --component development

# インストール先の指定
cmake --install . --prefix /custom/install/path

デバッグに役立つ環境変数:

変数名用途設定例
CMAKE_INSTALL_PREFIXインストール先の基準ディレクトリ/usr/local
CMAKE_PREFIX_PATH依存パッケージの検索パス/opt/dependencies
CMAKE_INSTALL_MESSAGEインストールメッセージの制御ALWAYS, LAZY, NEVER
  1. トラブルシューティングスクリプトの活用
#!/bin/bash
# install_check.sh

# インストール先の確認
echo "Checking installation directory structure..."
tree ${CMAKE_INSTALL_PREFIX}

# 実行ファイルの依存関係確認
echo "Checking binary dependencies..."
if [[ "$OSTYPE" == "darwin"* ]]; then
    otool -L ${CMAKE_INSTALL_PREFIX}/bin/*
else
    ldd ${CMAKE_INSTALL_PREFIX}/bin/*
fi

# パーミッションの確認
echo "Checking file permissions..."
ls -lR ${CMAKE_INSTALL_PREFIX}

# シンボリックリンクの確認
echo "Checking symbolic links..."
find ${CMAKE_INSTALL_PREFIX} -type l -ls

これらのツールと手法を組み合わせることで、CMake installのトラブルを効率的に特定し、解決することができます。また、定期的な検証を行うことで、潜在的な問題を早期に発見することも可能です。

CMake installの応用的なテクニック

条件付きインストールの実装方法

特定の条件に基づいてインストール内容を制御する高度なテクニックを紹介します:

# 機能フラグの定義
option(WITH_EXTRAS "Install extra components" OFF)
option(WITH_DOCUMENTATION "Install documentation" ON)
option(WITH_DEBUG_SYMBOLS "Install debug symbols" OFF)

# プラットフォーム検出
if(WIN32)
    set(PLATFORM_NAME "windows")
elseif(APPLE)
    set(PLATFORM_NAME "macos")
else()
    set(PLATFORM_NAME "linux")
endif()

# 条件付きインストール関数
function(conditional_install)
    # 追加コンポーネントのインストール
    if(WITH_EXTRAS)
        install(DIRECTORY extras/
            DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/extras
            COMPONENT extras
        )
    endif()

    # ドキュメントのインストール
    if(WITH_DOCUMENTATION)
        install(DIRECTORY docs/
            DESTINATION ${CMAKE_INSTALL_DOCDIR}
            COMPONENT documentation
            PATTERN "*.md"
            PATTERN "internal" EXCLUDE
        )
    endif()

    # デバッグシンボルのインストール
    if(WITH_DEBUG_SYMBOLS)
        if(MSVC)
            install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
                DESTINATION ${CMAKE_INSTALL_BINDIR}
                OPTIONAL
            )
        else()
            install(TARGETS ${PROJECT_NAME}
                RUNTIME
                DESTINATION ${CMAKE_INSTALL_BINDIR}
                COMPONENT debug
                NAMELINK_COMPONENT development
                CONFIGURATIONS Debug
            )
        endif()
    endif()
endfunction()

カスタムターゲットとの連携

インストールプロセスをカスタマイズし、追加のタスクを実行する方法:

# カスタムターゲットの作成
add_custom_target(prepare_install
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/staging
    COMMAND ${CMAKE_COMMAND} -E copy_directory
            ${CMAKE_SOURCE_DIR}/resources
            ${CMAKE_BINARY_DIR}/staging/resources
    COMMENT "Preparing files for installation"
)

# インストール前の処理
install(CODE "
    execute_process(
        COMMAND ${CMAKE_COMMAND} --build . --target prepare_install
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    )
")

# カスタムスクリプトの実行
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/post_install.cmake")

# インストール後の検証
install(CODE "
    message(STATUS \"Verifying installation...\")
    execute_process(
        COMMAND ${CMAKE_SOURCE_DIR}/scripts/verify_install.sh
        WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}
    )
")

パッケージ作成との統合

CMakeのインストール機能とパッケージ作成を統合する方法:

# パッケージ情報の設定
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
set(CPACK_PACKAGE_VENDOR "Your Company")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Brief description")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}")

# プラットフォーム固有のパッケージ設定
if(WIN32)
    set(CPACK_GENERATOR "NSIS")
    set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
    set(CPACK_NSIS_MODIFY_PATH ON)
elseif(APPLE)
    set(CPACK_GENERATOR "DragNDrop")
    set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
else()
    set(CPACK_GENERATOR "DEB")
    set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Your Name")
    set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.17)")
endif()

# コンポーネントのグループ化
set(CPACK_COMPONENTS_ALL runtime development documentation)
set(CPACK_COMPONENT_RUNTIME_DISPLAY_NAME "Runtime Files")
set(CPACK_COMPONENT_DEVELOPMENT_DISPLAY_NAME "Development Files")
set(CPACK_COMPONENT_DOCUMENTATION_DISPLAY_NAME "Documentation")

# 依存関係の設定
set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime)
set(CPACK_COMPONENT_DOCUMENTATION_DEPENDS runtime)

# CPack設定の適用
include(CPack)

# カスタムパッケージターゲットの作成
add_custom_target(package_with_tests
    COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
    COMMAND ${CMAKE_COMMAND} --build . --target package
    COMMENT "Running tests before packaging"
)

これらの高度なテクニックを活用することで、より柔軟で堅牢なインストールシステムを構築することができます。特に、条件付きインストールやカスタムターゲットとの連携は、複雑なプロジェクトの要件に対応する際に非常に有用です。また、パッケージ作成との統合により、配布可能なパッケージの作成も容易になります。