Ricerca…


introduzione

configure_file è una funzione di CMake per copiare un file in un'altra posizione e modificarne il contenuto. Questa funzione è molto utile per generare file di configurazione con percorsi, variabili personalizzate, utilizzando un modello generico.

Osservazioni

Copia un file in un'altra posizione e modifica il suo contenuto.

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

Copia un file in un file e sostituisce i valori delle variabili a cui si fa riferimento nel contenuto del file. Se è un percorso relativo, viene valutato rispetto alla directory sorgente corrente. Il file deve essere un file, non una directory. Se è un percorso relativo, viene valutato rispetto alla directory binaria corrente. Se si nomina una directory esistente, il file di input viene inserito in quella directory con il suo nome originale.

Se il file viene modificato, il sistema di generazione eseguirà nuovamente CMake per riconfigurare il file e generare nuovamente il sistema di generazione.

Questo comando sostituisce qualsiasi variabile nel file di input referenziato come $ {VAR} o @ VAR @ con i loro valori determinati da CMake. Se una variabile non è definita, verrà sostituita con nulla. Se viene specificato COPYONLY, non verrà eseguita alcuna espansione variabile. Se viene specificato ESCAPE_QUOTES, tutte le virgolette sostituite saranno in stile C con caratteri di escape. Il file verrà configurato con i valori correnti delle variabili CMake. Se viene specificato @ONLY, verranno sostituite solo le variabili del modulo @ VAR @ e $ {VAR} verrà ignorato. Questo è utile per la configurazione di script che usano $ {VAR}.

Le righe di file di input del modulo "#cmakedefine VAR ..." saranno sostituite con "#define VAR ..." o / * #undef VAR * / a seconda che VAR sia impostato su CMake su qualsiasi valore non considerato falso costante dal comando if (). (Il contenuto di "...", se presente, viene elaborato come sopra.) Le righe del file di input del modulo "# cmakedefine01 VAR" saranno sostituite con "#define VAR 1" o "#define VAR 0" in modo simile.

Con NEWLINE_STYLE è possibile regolare la fine della riga:

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

COPYONLY non deve essere utilizzato con NEWLINE_STYLE.

Genera un file di configurazione c ++ con CMake

Se abbiamo un progetto c ++ che usa un file di configurazione config.h con alcuni percorsi o variabili personalizzati, possiamo generarlo usando CMake e un file generico config.h.in.

Config.h.in può essere parte di un repository git, mentre il file generato config.h non verrà mai aggiunto, poiché viene generato dall'ambiente corrente.

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

Se abbiamo un config.h.in in questo modo:

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

Le precedenti CMakeLists genereranno un header c ++ come questo:

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

Examble basato sulla versione di controllo SDL2

Se hai un modulo cmake . È possibile creare una cartella chiamata in per memorizzare tutti i file di configurazione.

Ad esempio, hai un progetto chiamato FOO , puoi creare un file FOO_config.h.in come:

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

Questo file creerà un FOO_config.h nel percorso di installazione, con una variabile definita in c FOO_PATH_MAIN dalla variabile cmake. Per generarlo devi includere in file CMakeLists.txt, come questo (imposta percorsi e variabili):

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

Tale file conterrà i dati del modello e variabile con il tuo percorso reale, ad esempio:

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow