Szukaj…


Wprowadzenie

plik_konfiguracyjny to funkcja CMake służąca do kopiowania pliku do innej lokalizacji i modyfikowania jego zawartości. Ta funkcja jest bardzo przydatna do generowania plików konfiguracyjnych ze ścieżkami, zmiennymi niestandardowymi, przy użyciu szablonu ogólnego.

Uwagi

Skopiuj plik do innej lokalizacji i zmodyfikuj jego zawartość.

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

Kopiuje plik do pliku i zastępuje wartości zmiennych, do których odwołuje się treść pliku. Jeśli jest ścieżką względną, jest oceniana w odniesieniu do bieżącego katalogu źródłowego. Musi to być plik, a nie katalog. Jeśli jest ścieżką względną, jest oceniana w odniesieniu do bieżącego katalogu binarnego. Jeśli nazwa istniejącego katalogu, plik wejściowy jest umieszczany w tym katalogu z oryginalną nazwą.

Jeśli plik zostanie zmodyfikowany, system kompilacji uruchomi ponownie CMake, aby ponownie skonfigurować plik i ponownie wygenerować system kompilacji.

To polecenie zastępuje dowolne zmienne w pliku wejściowym o nazwie $ {VAR} lub @ VAR @ ich wartościami określonymi przez CMake. Jeśli zmienna nie jest zdefiniowana, zostanie zastąpiona niczym. Jeśli podano COPYONLY, wówczas nie nastąpi rozwinięcie zmiennej. Jeśli podano ESCAPE_QUOTES, wszelkie podstawione cudzysłowy będą oznaczone znakiem ucieczki w stylu C. Plik zostanie skonfigurowany z bieżącymi wartościami zmiennych CMake. Jeśli podano @ONLY, tylko zmienne w postaci @ VAR @ zostaną zastąpione, a $ {VAR} zostanie zignorowane. Jest to przydatne do konfigurowania skryptów używających $ {VAR}.

Wiersze pliku wejściowego w postaci „#cmakedefine VAR ...” zostaną zastąpione przez „#define VAR ...” lub / * *undund VAR * / w zależności od tego, czy VAR jest ustawione w CMake na dowolną wartość, która nie jest uważana za fałsz stała przez polecenie if (). (Treść „...”, jeśli istnieje, jest przetwarzana jak wyżej.) Wiersze pliku wejściowego w postaci „# cmakedefine01 VAR” zostaną zastąpione odpowiednio „#define VAR 1” lub „#define VAR 0” w podobny sposób.

Za pomocą NEWLINE_STYLE można zmienić zakończenie linii:

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

Nie można używać COPYONLY z NEWLINE_STYLE.

Wygeneruj plik konfiguracyjny c ++ za pomocą CMake

Jeśli mamy projekt c ++, który używa pliku konfiguracyjnego config.h z niektórymi niestandardowymi ścieżkami lub zmiennymi, możemy go wygenerować przy użyciu CMake i ogólnego pliku config.h.in.

Plik config.h.in może być częścią repozytorium git, a wygenerowany plik config.h nigdy nie zostanie dodany, ponieważ jest generowany z bieżącego środowiska.

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

Jeśli mamy plik config.h.in taki jak ten:

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

Poprzednie CMakeLists wygenerują taki nagłówek c ++:

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

Egzamin na podstawie wersji kontrolnej SDL2

Jeśli masz moduł cmake . Można utworzyć folder o nazwie in przechowywać wszystkie pliki konfiguracyjne.

Na przykład masz projekt o nazwie FOO , możesz utworzyć plik FOO_config.h.in , taki jak:

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

Ten plik utworzy plik FOO_config.h w ścieżce instalacji ze zmienną zdefiniowaną w c FOO_PATH_MAIN podstawie zmiennej cmake. Aby go wygenerować, musisz dołączyć plik in pliku CMakeLists.txt, tak jak poniżej (ustaw ścieżki i zmienne):

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

Plik ten będzie zawierał dane z szablonu i zmienną z twoją prawdziwą ścieżką, na przykład:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow