Sök…


Introduktion

configure_file är en CMake-funktion för att kopiera en fil till en annan plats och ändra dess innehåll. Denna funktion är mycket användbar för att generera konfigurationsfiler med sökvägar, anpassade variabler med en generisk mall.

Anmärkningar

Kopiera en fil till en annan plats och ändra dess innehåll.

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

Kopierar en fil till fil och ersätter variabla värden som refereras till i filinnehållet. Om är en relativ bana utvärderas den med avseende på den aktuella källkatalogen. Det måste vara en fil, inte en katalog. Om är en relativ bana utvärderas den med avseende på den aktuella binära katalogen. Om man namnger en befintlig katalog placeras inmatningsfilen i den katalogen med dess ursprungliga namn.

Om filen är modifierad kommer systemet att köra CMake igen för att konfigurera filen igen och generera build-systemet igen.

Detta kommando ersätter alla variabler i inmatningsfilen som refereras till som $ {VAR} eller @ VAR @ med deras värden som bestäms av CMake. Om en variabel inte definieras kommer den att ersättas med ingenting. Om COPYONLY anges kommer ingen variabel expansion att äga rum. Om ESCAPE_QUOTES anges kommer eventuella substituerade citat att undgå C-stil. Filen kommer att konfigureras med de aktuella värdena för CMake-variabler. Om @ONLY anges kommer endast variabler med formen @ VAR @ att ersättas och $ {VAR} ignoreras. Detta är användbart för att konfigurera skript som använder $ {VAR}.

Inmatning av filrader med formen "#cmakedefine VAR ..." kommer att ersättas med antingen "#define VAR ..." eller / * #undef VAR * / beroende på om VAR är inställd i CMake till något värde som inte betraktas som ett falskt konstant med if () -kommandot. (Innehållet i ”...”, om något, bearbetas som ovan.) Inmatning av filrader med formen "# cmakedefine01 VAR" kommer att ersättas med antingen "#define VAR 1" eller "#define VAR 0" på liknande sätt.

Med NEWLINE_STYLE kan linjens slut ändras:

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

COPYONLY får inte användas med NEWLINE_STYLE.

Generera en c ++ konfigurationsfil med CMake

Om vi har ett c ++ -projekt som använder en config.h-konfigurationsfil med vissa anpassade sökvägar eller variabler, kan vi generera den med CMake och en generisk fil config.h.in.

Config.h.in kan vara en del av ett git-arkiv, medan den genererade filen config.h aldrig kommer att läggas till, eftersom den genereras från den aktuella miljön.

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

Om vi har en config.h.in så här:

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

De tidigare CMakeLists genererar en c ++ rubrik som denna:

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

Examble baserad på SDL2-kontrollversion

Om du har en cmake modul. Du kan skapa en mapp som heter in att lagra alla konfigurationsfiler.

Till exempel har du ett projekt som heter FOO , du kan skapa en FOO_config.h.in fil som:

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

Den här filen skapar en FOO_config.h i installationsvägen, med en variabel definierad i c FOO_PATH_MAIN från cmake-variabeln. För att generera det måste du inkludera in filen i ditt CMakeLists.txt, som det här (ställ in banor och variabler):

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

Den filen kommer att innehålla data från mall och variabel med din riktiga sökväg, till exempel:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow