Поиск…


Вступление

configure_file - это функция CMake для копирования файла в другое место и изменения его содержимого. Эта функция очень полезна для создания файлов конфигурации с помощью путей, настраиваемых переменных, с использованием общего шаблона.

замечания

Скопируйте файл в другое место и измените его содержимое.

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

Копирует файл в файл и заменяет значения переменных, указанные в содержимом файла. Если это относительный путь, он оценивается относительно текущего каталога источника. Должен быть файл, а не каталог. Если это относительный путь, он оценивается по отношению к текущей двоичной директории. Если имена существующего каталога, входной файл помещается в этот каталог с его исходным именем.

Если файл изменен, система сборки повторно запустит CMake для повторной настройки файла и создания системы сборки снова.

Эта команда заменяет любые переменные во входном файле, на которые ссылаются как $ {VAR} или @ VAR @, с их значениями, определенными CMake. Если переменная не определена, она будет заменена ничем. Если COPYONLY указан, то переменное расширение не произойдет. Если указано ESCAPE_QUOTES, любые замещенные кавычки будут экранированы в стиле C. Файл будет настроен с текущими значениями переменных CMake. Если задано значение @ONLY, будут заменены только переменные формы @ VAR @, и $ {VAR} будет проигнорирован. Это полезно для настройки скриптов, использующих $ {VAR}.

Строки входных файлов формы «#cmakedefine VAR ...» будут заменены на «#define VAR ...» или / * #undef VAR * / в зависимости от того, установлен ли VAR в CMake на любое значение, которое не считается ложным константа командой if (). (Содержимое «...», если оно есть, обрабатывается, как указано выше.) Строки входных файлов формы «# cmakedefine01 VAR» будут заменены либо «#define VAR 1», либо «#define VAR 0» аналогичным образом.

С помощью NEWLINE_STYLE можно завершить настройку строки:

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

COPYONLY нельзя использовать с NEWLINE_STYLE.

Создайте файл конфигурации c ++ с помощью CMake

Если у нас есть проект c ++, который использует конфигурационный файл config.h с некоторыми настраиваемыми путями или переменными, мы можем сгенерировать его с помощью 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@"

Предыдущие CMakeLists будут генерировать заголовок c ++ следующим образом:

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

Экзамен на основе контрольной версии SDL2

Если у вас есть модуль cmake . Вы можете создать папку с именем 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 в пути установки с переменной, определенной в c FOO_PATH_MAIN из переменной cmake. Чтобы сгенерировать его, вам нужно включить 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