CMake: CMAKE_CFG_INTDIR 変数で構成ファイルを管理する


CMake 変数 CMAKE_CFG_INTDIR は、ビルドされた実行可能ファイルやライブラリの構成ファイルのデフォルトの出力ディレクトリを指定するために使用されます。 この変数は、CMakeLists.txt ファイル内の configure_file() コマンドによって設定されます。

使い方

CMAKE_CFG_INTDIR 変数を設定するには、以下の形式で CMakeLists.txt ファイル内に configure_file() コマンドを使用します。

configure_file("${CMAKE_SOURCE_DIR}/path/to/config.txt"
              "${CMAKE_CFG_INTDIR}/config.txt"
              COPYONLY)

この例では、path/to/config.txt ファイルが CMAKE_CFG_INTDIR ディレクトリ内の config.txt ファイルにコピーされます。 COPYONLY オプションは、CMake がファイルの内容を変更しないように指示します。

デフォルト値

CMAKE_CFG_INTDIR 変数のデフォルト値は、プラットフォームによって異なります。 一般的なデフォルト値は以下の通りです。

  • macOS: /Library/Preferences/\<PROJECT_NAME>\
  • Linux: /etc/\<PROJECT_NAME>\
  • Windows: C:\ProgramData\<PROJECT_NAME>\

応用例

CMAKE_CFG_INTDIR 変数は、以下の状況で使用できます。

  • ユーザー設定を保存したい場合。
  • 複数の構成ファイルを設定したい場合。
  • 構成ファイルの場所をカスタマイズしたい場合。

以下の例は、CMAKE_CFG_INTDIR 変数を使用して、config.txt ファイルと user.cfg ファイルを構成ディレクトリにコピーする方法を示しています。

set(CMAKE_CFG_INTDIR "/usr/local/etc/${PROJECT_NAME}")

configure_file("${CMAKE_SOURCE_DIR}/config.txt"
              "${CMAKE_CFG_INTDIR}/config.txt"
              COPYONLY)

configure_file("${CMAKE_SOURCE_DIR}/user.cfg.example"
              "${CMAKE_CFG_INTDIR}/user.cfg"
              COPYONLY)

この例では、config.txt ファイルは /usr/local/etc/${PROJECT_NAME}/config.txt にコピーされ、user.cfg.example ファイルは /usr/local/etc/${PROJECT_NAME}/user.cfg にコピーされます。 ユーザーは、user.cfg ファイルを編集して、独自の構成設定を追加できます。

  • 構成ファイルの場所をカスタマイズする場合は、適切なアクセス許可を設定する必要があります。
  • この変数は、CMake の install ターゲットによって使用されません。
  • CMAKE_CFG_INTDIR 変数は、configure_file() コマンドによってのみ設定できます。


cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_CFG_INTDIR "/usr/local/etc/${PROJECT_NAME}")

configure_file("${CMAKE_SOURCE_DIR}/config.txt"
              "${CMAKE_CFG_INTDIR}/config.txt"
              COPYONLY)

configure_file("${CMAKE_SOURCE_DIR}/user.cfg.example"
              "${CMAKE_CFG_INTDIR}/user.cfg"
              COPYONLY)

add_executable(myprogram main.cpp)

このコードは以下の動作を行います。

  1. CMake の最小バージョンを 3.10 に設定します。
  2. プロジェクトの名前を myproject に設定します。
  3. CMAKE_CFG_INTDIR 変数を /usr/local/etc/${PROJECT_NAME} に設定します。
  4. config.txt ファイルを /usr/local/etc/${PROJECT_NAME}/config.txt にコピーします。
  5. user.cfg.example ファイルを /usr/local/etc/${PROJECT_NAME}/user.cfg にコピーします。
  6. main.cpp ファイルを使用して myprogram という名前の実行可能ファイルを作成します。

説明

  • add_executable() コマンドは、実行可能ファイルを作成します。 この例では、main.cpp ファイルを使用して myprogram という名前の実行可能ファイルが作成されます。
  • configure_file() コマンドは、ファイルを構成ディレクトリにコピーします。 この例では、config.txt ファイルと user.cfg.example ファイルが /usr/local/etc/${PROJECT_NAME} ディレクトリにコピーされます。
  • set() コマンドは、CMake 変数の値を設定します。 この例では、CMAKE_CFG_INTDIR 変数の値を /usr/local/etc/${PROJECT_NAME} に設定します。
  • project() コマンドは、プロジェクトの名前を指定します。 この名前は、構成ファイルのパスや他の CMake 変数で使用されます。
  • cmake_minimum_required() コマンドは、CMake の最小バージョンを指定します。 このコードは、CMake 3.10 以降で実行されるように設計されています。

実行方法

このコードを実行するには、以下のコマンドを実行します。

mkdir build
cd build
cmake ..
make

このコマンドは、以下の操作を実行します。

  1. build ディレクトリを作成します。
  2. build ディレクトリに移動します。
  3. CMake を使用してプロジェクトを構成します。
  4. Make を使用してプロジェクトをビルドします。

ビルドが完了したら、以下のコマンドを実行して myprogram プログラムを実行できます。

./myprogram

カスタマイズ

このコードは、ニーズに合わせてカスタマイズできます。

  • add_executable() コマンドを使用して、作成する実行可能ファイルを追加できます。
  • configure_file() コマンドを使用して、コピーするファイルをさらに追加できます。
  • CMAKE_CFG_INTDIR 変数の値を変更して、構成ファイルの場所を変更できます。


しかし、CMAKE_CFG_INTDIR 変数を使用する代わりに、以下の代替方法も検討できます。

各構成ファイルの出力ディレクトリを個別に設定する

configure_file() コマンドの OUTPUT_PATH オプションを使用して、各構成ファイルの出力ディレクトリを個別に設定できます。

configure_file("${CMAKE_SOURCE_DIR}/config.txt"
              "${CMAKE_BINARY_DIR}/etc/config.txt"
              COPYONLY)

configure_file("${CMAKE_SOURCE_DIR}/user.cfg.example"
              "${CMAKE_INSTALL_PREFIX}/etc/user.cfg"
              COPYONLY)

この例では、config.txt ファイルは CMAKE_BINARY_DIR/etc/config.txt にコピーされ、user.cfg.example ファイルは CMAKE_INSTALL_PREFIX/etc/user.cfg にコピーされます。

カスタムインストールディレクトリを使用する

CMAKE_INSTALL_PREFIX 変数を使用して、カスタムインストールディレクトリを指定できます。 このディレクトリは、構成ファイルを含むすべてのインストールファイルのデフォルトの場所になります。

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

install(TARGETS myprogram DESTINATION "${CMAKE_INSTALL_PREFIX}")
install(FILES "${CMAKE_SOURCE_DIR}/config.txt"
              "${CMAKE_INSTALL_PREFIX}/etc/config.txt")
install(FILES "${CMAKE_SOURCE_DIR}/user.cfg.example"
              "${CMAKE_INSTALL_PREFIX}/etc/user.cfg")

この例では、myprogram 実行可能ファイルは /usr/local/myproject にインストールされ、config.txt ファイルと user.cfg.example ファイルは /usr/local/myproject/etc ディレクトリにインストールされます。

プロジェクト固有の変数を使用する

プロジェクト固有の変数を作成して、構成ファイルの場所を指定できます。

set(MYPROJECT_CONFIG_DIR "/usr/local/etc/${PROJECT_NAME}")

configure_file("${CMAKE_SOURCE_DIR}/config.txt"
              "${MYPROJECT_CONFIG_DIR}/config.txt"
              COPYONLY)

configure_file("${CMAKE_SOURCE_DIR}/user.cfg.example"
              "${MYPROJECT_CONFIG_DIR}/user.cfg"
              COPYONLY)

この例では、MYPROJECT_CONFIG_DIR 変数が /usr/local/etc/${PROJECT_NAME} に設定され、config.txt ファイルと user.cfg.example ファイルが MYPROJECT_CONFIG_DIR ディレクトリにコピーされます。

環境変数を使用する

環境変数を使用して、構成ファイルの場所を指定できます。

configure_file("${CMAKE_SOURCE_DIR}/config.txt"
              "$MYPROJECT_CONFIG_DIR/config.txt"
              COPYONLY)

configure_file("${CMAKE_SOURCE_DIR}/user.cfg.example"
              "$MYPROJECT_CONFIG_DIR/user.cfg"
              COPYONLY)

この例では、MYPROJECT_CONFIG_DIR 環境変数が設定されている場合、config.txt ファイルと user.cfg.example ファイルが MYPROJECT_CONFIG_DIR ディレクトリにコピーされます。

利点と欠点

各方法には、それぞれ利点と欠点があります。

方法利点欠点
configure_file()OUTPUT_PATH オプション各構成ファイルの場所を個別に制御できる冗長になる可能性がある
カスタムインストールディレクトリすべてのインストールファイルの場所を統一できるインストールディレクトリを変更するのが難しい
プロジェクト固有の変数プロジェクト固有の構成を容易に設定できるコードが煩雑になる可能性がある
環境変数設定が簡単環境変数を使用していない他のプログラムとの互換性がなくなる可能性がある