Suche…


Einführung

configure_file ist eine CMake-Funktion zum Kopieren einer Datei an einen anderen Speicherort und zum Ändern des Inhalts. Diese Funktion ist sehr nützlich zum Erzeugen von Konfigurationsdateien mit Pfaden, benutzerdefinierten Variablen, unter Verwendung einer generischen Vorlage.

Bemerkungen

Kopieren Sie eine Datei an einen anderen Ort und ändern Sie ihren Inhalt.

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

Kopiert eine Datei in eine Datei und ersetzt die im Dateiinhalt referenzierten Variablenwerte. Wenn es sich um einen relativen Pfad handelt, wird er in Bezug auf das aktuelle Quellverzeichnis ausgewertet. Das muss eine Datei sein, kein Verzeichnis. Wenn es sich um einen relativen Pfad handelt, wird er in Bezug auf das aktuelle Binärverzeichnis ausgewertet. Wenn ein vorhandenes Verzeichnis benannt wird, wird die Eingabedatei mit ihrem ursprünglichen Namen in diesem Verzeichnis abgelegt.

Wenn die Datei geändert wird, führt das Buildsystem CMake erneut aus, um die Datei neu zu konfigurieren und das Buildsystem erneut zu generieren.

Dieser Befehl ersetzt alle Variablen in der Eingabedatei, auf die als $ {VAR} oder @ VAR @ verwiesen wird, durch ihre von CMake bestimmten Werte. Wenn eine Variable nicht definiert ist, wird sie durch nichts ersetzt. Wenn COPYONLY angegeben ist, findet keine Variablenerweiterung statt. Wenn ESCAPE_QUOTES angegeben ist, werden alle ersetzten Anführungszeichen im C-Stil gespeichert. Die Datei wird mit den aktuellen Werten der CMake-Variablen konfiguriert. Wenn @ONLY angegeben wird, werden nur Variablen der Form @ VAR @ ersetzt und $ {VAR} wird ignoriert. Dies ist nützlich zum Konfigurieren von Skripts, die $ {VAR} verwenden.

Eingabedateizeilen der Form "#cmakedefine VAR ..." werden entweder durch "#define VAR ..." oder / * #undef VAR * / ersetzt, abhängig davon, ob VAR in CMake auf einen Wert gesetzt ist, der nicht als falsch gilt konstant durch den if () Befehl. (Der Inhalt von "..." wird, falls vorhanden, wie oben verarbeitet.) Eingabedateizeilen der Form "# cmakedefine01 VAR" werden auf ähnliche Weise durch "#define VAR 1" oder "#define VAR 0" ersetzt.

Mit NEWLINE_STYLE konnte das Zeilenende angepasst werden:

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

COPYONLY darf nicht mit NEWLINE_STYLE verwendet werden.

Generieren Sie eine C ++ - Konfigurationsdatei mit CMake

Wenn wir ein C ++ - Projekt haben, das eine Konfigurationsdatei config.h mit einigen benutzerdefinierten Pfaden oder Variablen verwendet, können wir es mit CMake und einer generischen Datei config.h.in generieren.

Die config.h.in kann Teil eines git-Repositorys sein, während die generierte Datei config.h niemals hinzugefügt wird, da sie aus der aktuellen Umgebung generiert wird.

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

Wenn wir eine config.h.in wie folgt haben:

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

Die vorherigen CMakeLists erzeugen einen C ++ - Header wie folgt:

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

Beispiel basiert auf SDL2-Steuerungsversion

Wenn Sie ein cmake Modul haben. Sie können einen Ordner erstellen, in dem alle Konfigurationsdateien gespeichert werden.

Sie haben beispielsweise ein Projekt namens FOO . Sie können eine Datei FOO_config.h.in wie FOO_config.h.in erstellen:

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

Diese Datei erstellt eine FOO_config.h im Installationspfad mit einer in c FOO_PATH_MAIN definierten Variable aus der cmake-Variablen. Um es zu generieren, müssen Sie es in Datei in Ihrer CMakeLists.txt aufnehmen, wie folgt (Pfade und Variablen setzen):

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

Diese Datei enthält die Daten aus der Vorlage und die Variable mit Ihrem tatsächlichen Pfad. Beispiel:

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow