サーチ…


前書き

configure_fileはファイルを別の場所にコピーしてその内容を変更するためのCMake関数です。この関数は、汎用テンプレートを使用して、パス、カスタム変数を含む設定ファイルを生成するのに非常に便利です。

備考

ファイルを別の場所にコピーし、その内容を変更します。

configure_file(<input> <output>
           [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
           [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

ファイルをファイルにコピーし、ファイルの内容で参照される変数の値を置き換えます。 ifは相対パスであり、現在のソースディレクトリに対して評価されます。ディレクトリではなくファイルでなければなりません。 ifは相対パスで、現在のバイナリディレクトリに関して評価されます。既存のディレクトリに名前を付ける場合、入力ファイルは元の名前でそのディレクトリに置かれます。

ファイルが変更された場合、ビルドシステムはCMakeを再実行してファイルを再構成し、ビルドシステムを再度生成します。

このコマンドは、$ {VAR}または@ VAR @として参照されている入力ファイル内のすべての変数を、CMakeによって決定された値で置き換えます。変数が定義されていない場合は、何も置き換えられません。 COPYONLYが指定されている場合、変数拡張は行われません。 ESCAPE_QUOTESが指定されている場合、置換された引用符はCスタイルでエスケープされます。ファイルは、CMake変数の現在の値で設定されます。 @ONLYを指定すると、@ VAR @の形式の変数だけが置換され、$ {VAR}は無視されます。これは、$ {VAR}を使用するスクリプトの設定に役立ちます。

"#cmakedefine VAR ..."の形式の入力ファイル行は、CMakeでVARがfalseとみなされない値に設定されているかどうかによって、#define VAR ...または/ * #undef VAR * /に置き換えられますif()コマンドで定数。 ( "..."の内容は上記のように処理されます) "#cmakedefine01 VAR"という形式の入力ファイル行は同様に "#define VAR 1"または "#define VAR 0"に置き換えられます。

NEWLINE_STYLEを使用すると、行末を調整できます。

'UNIX' or 'LF' for \n, 'DOS', 'WIN32' or 'CRLF' for \r\n.

NEWLINE_STYLEではCOPYONLYを使用しないでください。

CMakeでc ++設定ファイルを生成する

カスタムパスや変数を含むconfig.h構成ファイルを使用するc ++プロジェクトがある場合、CMakeと汎用ファイルconfig.h.inを使用して生成できます。

config.h.inはgitリポジトリの一部になることができますが、生成されたファイルconfig.hは現在の環境から生成されるため、追加されません。

#CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)

SET(PROJ_NAME "myproject")
PROJECT(${PROJ_NAME})

SET(${PROJ_NAME}_DATA     ""     CACHE PATH "This directory contains all DATA and RESOURCES")
SET(THIRDPARTIES_PATH    ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparties      CACHE PATH "This directory contains thirdparties")

configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/common/config.h.in"
            "${CMAKE_CURRENT_SOURCE_DIR}/include/config.h" )

config.h.inが次のようにある場合:

cmakedefine PATH_DATA "@myproject_DATA@"
cmakedefine THIRDPARTIES_PATH "@THIRDPARTIES_PATH@"

前のCMakeListは次のようなc ++ヘッダを生成します:

#define PATH_DATA "/home/user/projects/myproject/data"
#define THIRDPARTIES_PATH "/home/user/projects/myproject/thirdparties"

SDL2コントロールバージョンに基づくExamble

cmakeモジュールをお持ちの場合。すべての設定ファイルを格納inためにinというフォルダを作成できます。

たとえば、 FOOと呼ばれるプロジェクトがある場合、次のようなFOO_config.h.inファイルを作成できます。

//===================================================================================
//  CMake configuration file, based on SDL 2 version header
// ===================================================================================

#pragma once

#include <string>
#include <sstream>

namespace yournamespace
{
  /**
 *  \brief Information the version of FOO_PROJECT in use.
 *
 *  Represents the library's version as three levels: major revision
 *  (increments with massive changes, additions, and enhancements),
 *  minor revision (increments with backwards-compatible changes to the
 *  major revision), and patchlevel (increments with fixes to the minor
 *  revision).
 *
 *  \sa FOO_VERSION
 *  \sa FOO_GetVersion
 */
typedef struct FOO_version
{
    int major;        /**< major version */
    int minor;        /**< minor version */
    int patch;        /**< update version */
} FOO_version;

/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
*/
#define FOO_MAJOR_VERSION   0
#define FOO_MINOR_VERSION   1
#define FOO_PATCHLEVEL      0

/**
 *  \brief Macro to determine FOO version program was compiled against.
 *
 *  This macro fills in a FOO_version structure with the version of the
 *  library you compiled against. This is determined by what header the
 *  compiler uses. Note that if you dynamically linked the library, you might
 *  have a slightly newer or older version at runtime. That version can be
 *  determined with GUCpp_GetVersion(), which, unlike GUCpp_VERSION(),
 *  is not a macro.
 *
 *  \param x A pointer to a FOO_version struct to initialize.
 *
 *  \sa FOO_version
 *  \sa FOO_GetVersion
 */
#define FOO_VERSION(x)                          \
{                                   \
    (x)->major = FOO_MAJOR_VERSION;                 \
    (x)->minor = FOO_MINOR_VERSION;                 \
    (x)->patch = FOO_PATCHLEVEL;                    \
}

/**
 *  This macro turns the version numbers into a numeric value:
 *  \verbatim
    (1,2,3) -> (1203)
    \endverbatim
 *
 *  This assumes that there will never be more than 100 patchlevels.
 */
#define FOO_VERSIONNUM(X, Y, Z)                     \
    ((X)*1000 + (Y)*100 + (Z))

/**
 *  This is the version number macro for the current GUCpp version.
 */
#define FOO_COMPILEDVERSION \
    FOO_VERSIONNUM(FOO_MAJOR_VERSION, FOO_MINOR_VERSION, FOO_PATCHLEVEL)

/**
 *  This macro will evaluate to true if compiled with FOO at least X.Y.Z.
 */
#define FOO_VERSION_ATLEAST(X, Y, Z) \
    (FOO_COMPILEDVERSION >= FOO_VERSIONNUM(X, Y, Z))

}

// Paths
#cmakedefine FOO_PATH_MAIN "@FOO_PATH_MAIN@"

このファイルはインストールパスにFOO_config.hを作成し、cmake変数のFOO_PATH_MAIN変数を定義します。これを生成するにはin CMakeLists.txtファイルに以下のようにインクルードする必要があります(パスと変数の設定)。

MESSAGE("Configuring FOO_config.h ...")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/common/in/FOO_config.h.in"
"${FOO_PATH_INSTALL}/common/include/FOO_config.h" )

このファイルには、テンプレートのデータと実際のパスの変数が含まれます。たとえば、次のようになります。

// Paths
#define FOO_PATH_MAIN "/home/YOUR_USER/Respositories/git/foo_project"


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow