Recherche…


Introduction

configure_file est une fonction CMake permettant de copier un fichier vers un autre emplacement et de modifier son contenu. Cette fonction est très utile pour générer des fichiers de configuration avec des chemins, des variables personnalisées, en utilisant un modèle générique.

Remarques

Copiez un fichier vers un autre emplacement et modifiez son contenu.

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

Copie un fichier pour classer et remplacer les valeurs de variable référencées dans le contenu du fichier. Si est un chemin relatif, il est évalué par rapport au répertoire source actuel. Le doit être un fichier, pas un répertoire. Si est un chemin relatif, il est évalué par rapport au répertoire binaire actuel. Si nomme un répertoire existant, le fichier d'entrée est placé dans ce répertoire avec son nom d'origine.

Si le fichier est modifié, le système de génération réexécutera CMake pour reconfigurer le fichier et générer à nouveau le système de génération.

Cette commande remplace toutes les variables du fichier d'entrée référencées $ {VAR} ou @ VAR @ par leurs valeurs déterminées par CMake. Si une variable n'est pas définie, elle sera remplacée par rien. Si COPYONLY est spécifié, aucune expansion de variable n'aura lieu. Si ESCAPE_QUOTES est spécifié, toutes les citations substituées seront échappées avec le style C. Le fichier sera configuré avec les valeurs actuelles des variables CMake. Si @ONLY est spécifié, seules les variables de la forme @ VAR @ seront remplacées et $ {VAR} sera ignoré. Ceci est utile pour configurer des scripts qui utilisent $ {VAR}.

Les lignes de fichier d'entrée de la forme "#cmakedefine VAR ..." seront remplacées par "#define VAR ..." ou / * #undef VAR * / selon que VAR est défini dans CMake à une valeur non considérée comme fausse constante par la commande if (). (Le contenu de "...", le cas échéant, est traité comme ci-dessus.) Les lignes de fichier d'entrée de la forme "# cmakedefine01 VAR" seront remplacées de manière similaire par "#define VAR 1" ou "#define VAR 0".

Avec NEWLINE_STYLE, la fin de ligne peut être ajustée:

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

COPYONLY ne doit pas être utilisé avec NEWLINE_STYLE.

Générer un fichier de configuration c ++ avec CMake

Si nous avons un projet c ++ qui utilise un fichier de configuration config.h avec des chemins ou des variables personnalisés, nous pouvons le générer à l'aide de CMake et d'un fichier générique config.h.in.

Le fichier config.h.in peut faire partie d'un dépôt git, tandis que le fichier config.h généré ne sera jamais ajouté, car il est généré à partir de l'environnement actuel.

#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" )

Si nous avons un config.h.in comme ceci:

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

Les précédentes CMakeLists génèrent un en-tête c ++ comme ceci:

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

Examen basé sur la version de contrôle SDL2

Si vous avez un module cmake . Vous pouvez créer un dossier appelé in pour stocker tous les fichiers de configuration.

Par exemple, vous avez un projet appelé FOO , vous pouvez créer un fichier FOO_config.h.in comme:

//===================================================================================
//  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@"

Ce fichier créera un FOO_config.h dans le chemin d'installation, avec une variable définie dans c FOO_PATH_MAIN partir de la variable cmake. Pour le générer, vous devez inclure in fichier dans votre CMakeLists.txt, comme ceci (définir des chemins et des variables):

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" )

Ce fichier contiendra les données du modèle, et variable avec votre chemin réel, par exemple:

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow