CMake: CPACK_INCLUDE_TOPLEVEL_DIRECTORY変数の詳細解説


"CPACK_INCLUDE_TOPLEVEL_DIRECTORY" は、CMake の CPack モジュールで使用されるブール値変数です。この変数は、パッケージ作成時に作成されるアーカイブファイルにトップレベルディレクトリを含めるかどうかを制御します。

デフォルト値

CPack ジェネレータによってデフォルト値が異なります。

  • RPM または DEB などのパッケージマネージャー: トップレベルディレクトリを含まない
  • アーカイブジェネレータ (ZIP、TGZ など): トップレベルディレクトリを含む

使用方法

この変数は、CMakeLists.txt ファイル内で設定できます。

set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1)

上記のコードは、すべての CPack ジェネレータでトップレベルディレクトリを含めます。

以下の例は、"MyProject" という名前のプロジェクトで、"MyProject-1.0.0.zip" という名前の ZIP アーカイブを作成する方法を示します。

project(MyProject 1.0.0)

set(CMAKE_INSTALL_PREFIX "/usr/local")

install(TARGETS MyProject DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

set(CPACK_GENERATOR ZIP)
set(CPACK_RESOURCE_FILE_MODE "COPY")
set(CPACK_PACKAGE_DESCRIPTION_FILE "MyProject-description.txt")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "MyProject")

set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1)

上記のコードを実行すると、"MyProject-1.0.0.zip" という名前の ZIP アーカイブが作成されます。このアーカイブには、"MyProject" という名前のディレクトリと、その中に "MyProject" という実行ファイルが含まれます。

  • "CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY" という同様の変数があります。これは、コンポーネントパッケージングの場合に動作をオーバーライドするために使用されます。


トップレベルディレクトリを含む ZIP アーカイブを作成する

project(MyProject 1.0.0)

set(CMAKE_INSTALL_PREFIX "/usr/local")

install(TARGETS MyProject DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

set(CPACK_GENERATOR ZIP)
set(CPACK_RESOURCE_FILE_MODE "COPY")
set(CPACK_PACKAGE_DESCRIPTION_FILE "MyProject-description.txt")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "MyProject")

set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1)

トップレベルディレクトリを含まない ZIP アーカイブを作成する

project(MyProject 1.0.0)

set(CMAKE_INSTALL_PREFIX "/usr/local")

install(TARGETS MyProject DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

set(CPACK_GENERATOR ZIP)
set(CPACK_RESOURCE_FILE_MODE "COPY")
set(CPACK_PACKAGE_DESCRIPTION_FILE "MyProject-description.txt")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "MyProject")

set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)

このコードを実行すると、"MyProject-files-1.0.0.zip" という名前の ZIP アーカイブが作成されます。このアーカイブには、"MyProject" という実行ファイルのみが含まれ、"MyProject" という名前のディレクトリは含まれません。

project(MyProject 1.0.0)

set(CMAKE_INSTALL_PREFIX "/usr/local")

add_component(MyProject ALL MyProject)

install(TARGETS MyProject DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

set(CPACK_GENERATOR ZIP)
set(CPACK_RESOURCE_FILE_MODE "COPY")
set(CPACK_PACKAGE_DESCRIPTION_FILE "MyProject-description.txt")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "MyProject")

set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 1)
  • CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 変数は、コンポーネントパッケージングの場合にトップレベルディレクトリを含めるかどうかを制御します。
  • CPACK_INCLUDE_TOPLEVEL_DIRECTORY 変数は、トップレベルディレクトリを含めるかどうかを制御します。
  • CPACK_PACKAGE_INSTALL_DIRECTORY 変数は、パッケージのインストールディレクトリを指定します。
  • CPACK_PACKAGE_DESCRIPTION_FILE 変数は、パッケージの説明ファイルのパスを指定します。
  • CPACK_RESOURCE_FILE_MODE 変数は、リソースファイルの処理方法を指定します。
  • CPACK_GENERATOR 変数は、使用する CPack ジェネレータを指定します。
  • install() コマンドを使用して、ターゲットをインストールディレクトリにインストールします。
  • 各例では、set() コマンドを使用して、関連する CPack 変数を設定しています。
  • 上記のコード例は、"MyProject" という名前のシンプルなプロジェクトを示しています。
  • 実際のプロジェクトでは、より複雑な構成が必要になる場合があります。


インストールディレクトリを調整する

CMAKE_INSTALL_PREFIX 変数を使用して、インストールディレクトリを調整することで、トップレベルディレクトリを含める必要性を排除できます。

set(CMAKE_INSTALL_PREFIX "/usr/local/MyProject")

install(TARGETS MyProject DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

上記のコードでは、"MyProject" という名前のディレクトリにターゲットがインストールされます。このディレクトリはトップレベルディレクトリとなるため、"CPACK_INCLUDE_TOPLEVEL_DIRECTORY" 変数は不要になります。

アーカイブ作成時にファイルを選択的にコピーする

CPack の CPACK_PACKAGE_SELECT_FILE_NAMES 変数を使用して、アーカイブに含めるファイルを個別に指定できます。

set(CPACK_PACKAGE_SELECT_FILE_NAMES "MyProject" "MyProject/bin/MyProject")

上記のコードでは、"MyProject" ディレクトリと "MyProject/bin/MyProject" ファイルのみがアーカイブに含まれます。

カスタムパッケージングスクリプトを使用する

CPack の代わりに、カスタムのパッケージングスクリプトを使用してアーカイブを作成することができます。このスクリプトでは、トップレベルディレクトリを含めるかどうかを自由に制御できます。

各方法の利点と欠点

方法利点欠点
インストールディレクトリを調整するシンプルインストールディレクトリの構造が制限される
アーカイブ作成時にファイルを選択的にコピーする柔軟性が高い複雑
カスタムパッケージングスクリプトを使用する完全に制御可能最も複雑

最適な方法の選択

最適な方法は、プロジェクトの要件によって異なります。

  • 完全な制御が必要な場合は、カスタムパッケージングスクリプトを使用します。
  • 柔軟性が必要な場合は、アーカイブ作成時にファイルを選択的にコピーする方法を使用します。
  • シンプルなプロジェクトの場合は、インストールディレクトリを調整する方法が最も簡単です。
  • 上記以外にも、"CPACK_INCLUDE_TOPLEVEL_DIRECTORY" 変数の代替方法が存在する可能性があります。