Zoeken…


Invoering

configure_file is een CMake-functie voor het kopiëren van een bestand naar een andere locatie en het wijzigen van de inhoud. Deze functie is erg handig voor het genereren van configuratiebestanden met paden, aangepaste variabelen, met behulp van een generieke sjabloon.

Opmerkingen

Kopieer een bestand naar een andere locatie en wijzig de inhoud.

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

Kopieert een bestand naar bestand en vervangt variabele waarden waarnaar in de bestandsinhoud wordt verwezen. Als een relatief pad is, wordt het geëvalueerd ten opzichte van de huidige brondirectory. Het moet een bestand zijn, geen map. Als een relatief pad is, wordt het geëvalueerd ten opzichte van de huidige binaire map. Als u een bestaande map een naam geeft, wordt het invoerbestand met de oorspronkelijke naam in die map geplaatst.

Als het bestand is gewijzigd, voert het buildsysteem CMake opnieuw uit om het bestand opnieuw te configureren en het buildsysteem opnieuw te genereren.

Deze opdracht vervangt alle variabelen in het invoerbestand waarnaar wordt verwezen als $ {VAR} of @ VAR @ door hun waarden zoals bepaald door CMake. Als een variabele niet is gedefinieerd, wordt deze door niets vervangen. Als COPYONLY is opgegeven, vindt er geen variabele uitbreiding plaats. Als ESCAPE_QUOTES is opgegeven, worden vervangen door aanhalingstekens in C-stijl. Het bestand wordt geconfigureerd met de huidige waarden van CMake-variabelen. Als @ONLY is opgegeven, worden alleen variabelen van het formulier @ VAR @ vervangen en wordt $ {VAR} genegeerd. Dit is handig voor het configureren van scripts die $ {VAR} gebruiken.

Invoerbestandregels met de vorm "#cmakedefine VAR ..." worden vervangen door "#define VAR ..." of / * #undef VAR * / afhankelijk van of VAR is ingesteld in CMake op een waarde die niet als vals wordt beschouwd constant door het if () commando. (Inhoud van "...", indien aanwezig, wordt verwerkt zoals hierboven.) Invoerbestandregels met de vorm "# cmakedefine01 VAR" worden op dezelfde manier vervangen door "#define VAR 1" of "#define VAR 0".

Met NEWLINE_STYLE kan het regeleinde worden aangepast:

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

COPYONLY mag niet worden gebruikt met NEWLINE_STYLE.

Genereer een c ++ configuratiebestand met CMake

Als we een c ++ -project hebben dat een configuratiebestand van config.h gebruikt met enkele aangepaste paden of variabelen, kunnen we dit genereren met behulp van CMake en een generiek bestand config.h.in.

De config.h.in kan onderdeel zijn van een git repository, terwijl het gegenereerde bestand config.h nooit zal worden toegevoegd, omdat het wordt gegenereerd vanuit de huidige omgeving.

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

Als we een config.h.in hebben zoals deze:

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

De vorige CMakeLists zullen een c ++ header als volgt genereren:

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

Voorbeeld op basis van SDL2-besturingsversie

Als u een cmake module hebt. U kunt een opgeroepen map maken om alle configuratiebestanden in te slaan.

U hebt bijvoorbeeld een project met de naam FOO , u kunt een FOO_config.h.in bestand maken zoals:

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

Dit bestand maakt een FOO_config.h in het installatiepad, met een variabele gedefinieerd in c FOO_PATH_MAIN van de variabele cmake. Om het te genereren, moet u dit als volgt opnemen in uw CMakeLists.txt (paden en variabelen instellen):

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

Dat bestand bevat de gegevens van de sjabloon en variabele met uw echte pad, bijvoorbeeld:

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow